알고리즘/분할정복(Divide and conquer)

[백준 2309] - [분할정복] 일곱 난쟁이 - JAVA

팡스 2018. 11. 30. 10:56

문제 링크 : https://www.acmicpc.net/problem/2309




이문제는 의도하는바만 잘 파악하면 어렵지 않게 문제를 풀 수 있다. 


입력은 무조건 9명의 난쟁이애 대한 키 정보이고 

두명을 제외한 나머지의 키의 합이 무조건 100이 된다고 한다. 

가능한 답이 여러가지일 경우 아무거나 출력하면 된다고하는데 이럴때는 100이 이루어지면 바로 종료시키고 출력시키면 된다. 


문제를 푸는 방법은 두 난쟁이의 키를 전체 아홉 난쟁이 키의 총합에서 뺀 값이 100이면 두 난쟁이의 값을 최소 값으로 변경 시킨 후 정렬하고 출력시키면 된다. 

일곱 난장이들의 키를 합하는 것보다 전체 합에서 두명의 키만 뺴는것이 더 바람직할것이기떄문에 두 난쟁이의 키만 빼면 된다. 


소스

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
31
32
33
34
35
36
37
38
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
 
public class Main {
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int max = 100;
        int size = 9;
        int sum = 0;
        int[] dwarfs = new int[size];
        
        for(int i=0; i < size; i++) {
            dwarfs[i] = Integer.parseInt(br.readLine());
            sum += dwarfs[i];
        }
        
        boolean checked = false;
        for(int i=0; i < size; i++) {
            for(int j = i+1; j < size; j++) {
                if(sum - (dwarfs[i] + dwarfs[j]) == max) {
                    dwarfs[i] = Integer.MIN_VALUE;
                    dwarfs[j] = Integer.MIN_VALUE;
                    checked = true;
                    break;
                }
                if(checked) break;
            }
        }
        Arrays.sort(dwarfs);
        
        for(int dwarf:dwarfs) if(dwarf != Integer.MIN_VALUE) System.out.println(dwarf);
        
        br.close();
    }
}
cs