알고리즘/분할정복(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 |