본문 바로가기

Algorithm

[Java] 백준 2309번 : 일곱 난쟁이

1. 문제

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

 

2309번: 일곱 난쟁이

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

www.acmicpc.net

2. 풀이

- 브루트 포스는 완전 탐색 알고리즘으로 모든 경우의 수를 구하는 알고리즘이다.

  • 우선, 입력하는 값을 리스트에 넣고 안에 값을 모두 더한다.
  • 오름차순 출력하기 위해 Collections.sort를 활용하여 정렬을 한다.
  • 모든 경우의 수를 대입하기 위해 이중 for 문을 활용하고, if 문에 모두 더한 값 (sum) - i번째 - j번째 값이 == 100과 같은지 확인한다. (모든 값을 두개씩 빼주면서 100이란 값을 찾기 위함이다.
  • 100이란 값을 찾았다면 출력을 위해 for문을 만들고, 100의 값을 만들었을 때, 나왔던 i의 값과 j의 값을 k에 비교하고 그 값을 continue 해주고 나머지 출력한다.

 

 

3. 코드

package baekjoon;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Q2309 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        List<Integer> list = new ArrayList<>();

        int sum = 0;
        for (int i = 0; i < 9; i++) {
            list.add(scanner.nextInt());
            sum += list.get(i); // 난쟁이 키 총 합
        }
        Collections.sort(list); // 정렬

        for (int i = 0; i < list.size(); i++) { // 브루트포스 나올 수 있는 모든 경우의 수를 탐색
            for (int j = i + 1; j < list.size(); j++) {

                if (sum - list.get(i) - list.get(j) == 100) {
                    for (int k = 0; k < list.size(); k++) {
                        if (i == k || j == k) {
                            continue;
                        }
                        System.out.println(list.get(k));
                    }
                }
            }
        }
    }
}