[BOJ 2309] 일곱 난쟁이
업데이트:
문제
- BOJ 2309
- 문제의 저작권은 Baekjoon Online Judge에 있습니다.
접근방식
9명의 일곱난쟁이 중 7명을 뽑으면서 각 합이 100이 되는 경우 뽑기를 중단하도록 조합함수를 작성해주었다. 작은 수부터 차례대로 더해주기 위해서 난쟁이를 배열에 입력받은 후 오름차순 해주었고, 조합은 재귀를 통해 해결했다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
//일곱난쟁이
public class Main {
static final int SUM = 10; //상수
static int[] arr = new int[9]; //아홉난쟁이 키 배열
static boolean[] visited = new boolean[9];
static int[] result = new int[7]; //뽑은 난쟁이
static boolean isFind = false;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for(int i=0; i<9; i++) {
int height = Integer.parseInt(br.readLine()); //키
arr[i] = height;
}
Arrays.sort(arr); //오름차순
//조합 시작
select(0, 0, 0);
}
static void select(int cnt, int start, int sum) { //뽑은 개수, 시작점, 키 합
if(cnt == 7) { //일곱난쟁이를 모두 뽑았다면
if(sum == 100) { //뽑은 일곱명의 키 합이 100이면
isFind = true;
for(int e : result) System.out.println(arr[e]);
return;
}
return;
}
for(int i=start; i<9; i++) {
if(sum>100) return;
if(!visited[i]) {
result[cnt] = i; //i번째 난쟁이 뽑음
visited[i] = true;
sum += arr[i]; //키를 누적시키자
select(cnt+1, i+1, sum);
visited[i] = false;
sum -= arr[i];
if(isFind) break;
}
}
}
}