백준 - 3040번(백설 공주와 일곱 난쟁이)

최지홍·2022년 2월 14일
0

백준

목록 보기
57/145

문제 출처: https://www.acmicpc.net/problem/3040


  • 매일 매일 일곱 난쟁이는 광산으로 일을 하러 간다. 난쟁이가 일을 하는 동안 백설공주는 그들을 위해 저녁 식사를 준비한다. 백설공주는 의자 일곱개, 접시 일곱개, 나이프 일곱개를 준비한다.

  • 어느 날 광산에서 아홉 난쟁이가 돌아왔다. (왜 그리고 어떻게 아홉 난쟁이가 돌아왔는지는 아무도 모른다) 아홉 난쟁이는 각각 자신이 백설공주의 일곱 난쟁이라고 우기고 있다.

  • 백설공주는 이런 일이 생길 것을 대비해서, 난쟁이가 쓰고 다니는 모자에 100보다 작은 양의 정수를 적어 놓았다. 사실 백설 공주는 공주가 되기 전에 매우 유명한 수학자였다. 따라서, 일곱 난쟁이의 모자에 쓰여 있는 숫자의 합이 100이 되도록 적어 놓았다.

  • 아홉 난쟁이의 모자에 쓰여 있는 수가 주어졌을 때, 일곱 난쟁이를 찾는 프로그램을 작성하시오. (아홉 개의 수 중 합이 100이 되는 일곱 개의 수를 찾으시오)


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

public class Main {

    private static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int[] people = new int[9];
        boolean[] isSelected = new boolean[9];
        for (int i = 0; i < people.length; i++) {
            people[i] = Integer.parseInt(reader.readLine());
        }

        combination(people, isSelected, 0, 0, 0);

        System.out.println(sb);
    }

    private static void combination(int[] target, boolean[] flag, int start, int count, int sum) {
        if (sum > 100) return;
        if (count == 7) {
            if (sum == 100) {
                for (int i = 0; i < flag.length; i++) {
                    if (flag[i]) {
                        sb.append(target[i]).append("\n");
                    }
                }
            }
        }

        for (int i = start; i < target.length; i++) {
            flag[i] = true;
            combination(target, flag, i + 1, count + 1, sum + target[i]);
            flag[i] = false;
        }
    }

}

  • 조합을 이용하여 풀 수 있는 문제로 앞전의 백설 공주 문제와 거의 같은 문제이다.
  • 재귀를 돌리며 조건을 판단할 때 조건식을 설정하는 부분이 아직 매끄럽지 못한 것 같다. 좀 더 연습이 필요할 것 같다.
profile
백엔드 개발자가 되자!

0개의 댓글