
14697번: 방 배정하기
정보 초등학교 6학년 여학생들은 단체로 2박 3일 수학여행을 가기로 했다. 학생들이 묵을 숙소에는 방의 정원(방 안에 있는 침대 수)을 기준으로 세 종류의 방이 있으며, 같은 종류의 방들이 여러
www.acmicpc.net
브루스포스 알고리즘이며, 나는 재귀를 이용하여 문제를 풀었다.
재귀의 base case를 방 배정을 성공(true)하느냐, 실패(false)하느냐로 나눴는데,
꼭 모든 방에 학생을 배분할 필요가 없으므로, 아직 모든 방에 배정하기 전인데 남은 학생 수가 0이 되어도 탈출 조건이 될 수 있다.
<base case>
- 모든 방에 배정 여부와 관계없이 남은 학생이 0명이면, true를 반환
- 마지막 방까지 배정했을 때, 남은 학생이 존재하면 false를 반환
재귀함수를 호출할 때는, 방에 배정하고 남은 학생을 인수로 넘겨준다.
소스코드:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.*; | |
public class n14697 { | |
static int N; | |
static int[] room = new int[3]; | |
public static void main(String[] args) throws Exception { | |
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | |
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); | |
String[] sarr = br.readLine().split(" "); | |
for (int i = 0; i < 3; i++) | |
room[i] = Integer.parseInt(sarr[i]); | |
N = Integer.parseInt(sarr[3]); | |
boolean res = solve(0, N); | |
if (res) | |
bw.write(1 + "\n"); | |
else | |
bw.write(0 + "\n"); | |
bw.flush(); | |
} | |
public static boolean solve(int idx, int n) { | |
if (idx == 3 && n > 0) | |
return false; | |
if (n == 0) | |
return true; | |
for (int i = n / room[idx]; i >= 0; i--) { | |
if (solve(idx + 1, n - i * room[idx])) | |
return true; | |
} | |
return false; | |
} | |
} |
'BOJ' 카테고리의 다른 글
[백준 17779번] 게리맨더링 2 (java) (0) | 2021.02.14 |
---|---|
[백준 16637번] 괄호 추가하기 (java) (0) | 2021.02.14 |
[백준 15904번] UCPC는 무엇의 약자일까? (java) (0) | 2021.02.12 |
[백준 15903번] 카드 합체 놀이 (java) (0) | 2021.02.11 |
[백준 11000번] 강의실 배정 (java) (0) | 2021.02.11 |