한 개의 저울이 있고 N개의 저울 추가 있을 때
N개의 저울추를 사용해서 측정할 수 없는 무게의 최솟값을 출력하는 저울 문제이다.
이분 탐색으로 풀면 될 것 같다고 생각했지만
그리디 알고리즘으로 분류된 만큼 다른 해법이 있을 거라 생각했다.
그리고 어떤 무게에 대해 측정할 수 있는지 없는지를 체크하는 메소드를 어떻게 짤까 고민을
많이 했다. 근데 생각해보면 그리디 알고리즘 문제에서는 대부분 그런 복잡한 과정 없이
생각지도 못한 방법으로 간단히 문제가 풀린다.
이 문제 역시 그런 문제였다.
해법은 간단하다.
입력받은 N개의 저울추를 오름차순으로 정렬한 뒤
저울이 측정할 수 있는 무게의 최솟값인 1부터
저울추 i번 부터 N번까지를 비교하면 된다.
최솟값인 1이 저울추 i번으로 측정 할 수 있다면
최솟값에 저울 추 i번의 무게를 더해준다.
만약 최솟값보다 저울추의 무게가 무거울 경우엔
그 최솟값이 저울 추 N개 측정할 수 있는 가장 작은 값이 된다.
예제로 주어진
7
3 1 6 2 7 30 1
을 오름차순으로 정렬하면
1 1 2 3 6 7 30 이 된다.
저울로 잴 수 있는 최솟값은 1
저울추[0] = 1이 최솟값 1보다 무겁지 않으므로
최솟값은 2가 된다.
저울추[1] = 1 이 최솟값 2보다 무겁지 않으므로
최솟값은 3이 된다.
저울추[2] = 2 --> 최솟값 5
저울추[3] = 3 --> 최솟값 8
저울추[4] = 6 --> 최솟값 14
저울추[5] = 7 --> 최솟값 21
저울추[6] = 30은 최솟값 21보다 무겁다.
그러므로 저울 추 N개로 측정할 수 있는 최솟값은 21이다.
코드는 위 내용과 똑같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int [] a = new int[n];
for(int i=0; i<n; i++) {
a[i] = scan.nextInt();
}
int min = 1;
for(int i=0; i<n; i++) {
if(min < a[i]) {
break;
}
min += a[i];
}
System.out.println(min);
}
|
어떻게 이러한 방식을 찾아내는지는 모르겠다.
그리고 나중에 알고리즘 분류를 모르고 문제를 풀 때
어떤 알고리즘으로 해결할지 알아내는 것도 걱정이다.
'Algorithm' 카테고리의 다른 글
백준 14502 연구소 Java (1) | 2019.06.18 |
---|---|
백준 2580 스도쿠 Java (0) | 2019.06.17 |
백준 1138 한 줄로 서기 Java (4) | 2019.06.13 |
백준 9663 N-Queen Java (0) | 2019.06.13 |
백준 2529 부등호 Java (0) | 2019.06.13 |