백준 2347번 저울 (자바)
출처
문제
하나의 양팔 저울을 이용하여 물건의 무게를 측정하려고 한다. 이 저울의 양 팔의 끝에는 물건이나 추를 올려놓는 접시가 달려 있고, 양팔의 길이는 같다. 또한, 저울의 한쪽에는 저울추들만 놓을 수 있고, 다른 쪽에는 무게를 측정하려는 물건만 올려놓을 수 있다.
무게가 양의 정수인 N개의 저울추가 주어질 때, 이 추들을 사용하여 측정할 수 없는 양의 정수 무게 중 최솟값을 구하는 프로그램을 작성하시오.
예를 들어, 무게가 각각 3, 1, 6, 2, 7, 30, 1인 7개의 저울추가 주어졌을 때, 이 추들로 측정할 수 없는 양의 정수 무게 중 최솟값은 21이다.
입력
첫 째 줄에는 저울추의 개수를 나타내는 양의 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 둘째 줄에는 저울추의 무게를 나타내는 N개의 양의 정수가 빈칸을 사이에 두고 주어진다. 각 추의 무게는 1 이상 1,000,000 이하이다.
출력
첫째 줄에 주어진 추들로 측정할 수 없는 양의 정수 무게 중 최솟값을 출력한다.
입출력 예
걸린 시간
1시간 좀 넘게 걸린 것 같다.
접근 방법
그리디 문제라는데 그리디란 뭘까... 어렵다
신박한 개념으로 문제를 풀었다. (물론 다른분들의 도움으로ㅎㅎ)
정렬시킨 후 누적합을 이용해서 문제를 푸는데 현재 누적합과 다음 누적합 사이의 값은 주어진 값들로 모두 만들 수 있다는 것이다. (모두 만들 수 있다는 게 굉장히 신기했다... 이런 걸 어떻게 생각하는 거지)
예를 들어, 1 1 2 3 6 7 30 이 주어졌을 때
누적합은 1 2 4 7 13 20 50 이다.
누적합 사이의 값들을 주어진 수로 만들 수 있는지 확인해보겠다.
1 일 때 1을 만들 수 있다.
2 일 때 2을 만들 수 있다.
4 일때 3(1,2)을 만들 수 있다.
7 일때 5(2,3), 6(1,2,3)을 만들 수 있다.
13 일때 8, 9, 10, 11, 12을 만들 수 있다.
20 일때 14, 15, 16, 17, 18, 19을 만들 수 있다.
50 일때 21을 만들 수 없다!
위와 같은 경우(이전 누적합+1)를 만들 수 없는 경우가 바로 측정할 수 없는 양이다. 이 경우가 바로 누적합이 다음 원소보다 작은 경우다. 때문에 조건을 만족하면 바로 반환하도록 하였다.
내 코드
고려할 점
1. 그리디 사용할 것
2. 조건을 생각할 것
'알고리즘 > 백준' 카테고리의 다른 글
[백준 1719] 택배 (자바) (0) | 2021.02.14 |
---|---|
[백준 14890] 경사로 (자바) (0) | 2021.02.07 |
[백준 1915] 가장 큰 정사각형 (자바) (0) | 2021.02.03 |
[백준 10282] 해킹 (자바) (1) | 2021.02.02 |
[백준 2467] 용액 (자바) (0) | 2021.02.02 |