View

https://www.acmicpc.net/problem/2309

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

 

문제 요약

9명의 난쟁이 키가 입력으로 주어지면, 합이 100이 되는 일곱 난쟁이를 찾아내야 한다.

 

 

문제 해결 아이디어

입력 크기가 크지 않으므로 모든 경우를 검사해 보는 완전탐색 기법을 생각했다.

  1. 9명 중에 7명을 뽑는다. 순서는 중요하지 않기 때문에 조합으로 생각했다.
  2. 뽑힌 7명의 합을 구해 100과 비교한다
  3. 100이면 출력

 

완성된 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main_BOJ_2309_일곱난쟁이 {
	static int[] input;
	static int[] results;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		input = new int[9];
		results = new int[7];

		for (int i = 0; i < 9; i++)
			input[i] = Integer.parseInt(br.readLine());

		solve(0, 0);
	} // end of main

	private static void solve(int cnt, int start) {
		// 9명 중에 7명을 뽑는 조합
		StringBuilder sb = new StringBuilder();

		if (cnt == 7) {
			int sum = 0;
			for (int i = 0; i < 7; i++)
				sum += results[i];
			if (sum == 100) { // 합계가 100인 조합 출력
				Arrays.sort(results); // 오름차순 정렬
				for (int i = 0; i < 7; i++)
					sb.append(results[i]).append("\n");
			}
			System.out.print(sb);
			return;
		}

		for (int i = start; i < 9; i++) {
			results[cnt] = input[i];
			solve(cnt + 1, i + 1);
		}
	}
}// end of class
Share Link
reply
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30