https://www.acmicpc.net/problem/2437
문제 설명
하나의 양팔 저울을 이용하여 물건의 무게를 측정하려고 한다. 이 저울의 양 팔의 끝에는 물건이나 추를 올려놓는 접시가 달려 있고, 양팔의 길이는 같다. 또한, 저울의 한쪽에는 저울추들만 놓을 수 있고, 다른 쪽에는 무게를 측정하려는 물건만 올려놓을 수 있다.
무게가 양의 정수인 N개의 저울추가 주어질 때, 이 추들을 사용하여 측정할 수 없는 양의 정수 무게 중 최솟값을 구하는 프로그램을 작성하시오.
예를 들어, 무게가 각각 3, 1, 6, 2, 7, 30, 1인 7개의 저울추가 주어졌을 때, 이 추들로 측정할 수 없는 양의 정수 무게 중 최솟값은 21이다.
문제풀이
사용 알고리즘
여기서는 누적합을 이용해 문제풀이를 한다. 아래 글을 읽고 알고리즘 이해가 되었다.
https://aerocode.net/392
백준 2437 풀이 및 해설
개요 매우 복잡해보이는 문제가 그림으로 풀면 매우 단순하게 풀리는 경우는 그리 드문일이 아닙니다. 이 문제는 수학적 귀납법으로도 풀 수 있지만, 수직선을 사용하면 훨씬 직관적이고 쉽게
aerocode.net
문제에서는 측정할 수 없는 가장 작은 양의 정수 무게를 구하라 이다.
이는 측정할 수 있는 무게의 구간에서 빈 곳을 찾는 것이다.
- 측정할 수 있는 무게의 구간 구하기
- 조건 : 1~n까지 연속된 수열이다
- 1~n까지 합 = 측정할 수 있는 무게의 구간
무게 [1,2,3,4] 는 누적합10 = (1,2,3,4). 그러니까 1kg ~ 10kg까지 모두 조합가능하다.
그렇다면 여기서 20kg을 더 추가하면 어떻게 될까? 미리 정답을 말하자면 11kg이 측정불가능한 최소 단위다.
무게 [1,2,3,4,20] 을 계산해보자.
[1,2,3,4]인 경우의 누적합은 10 이다.
여기서 20kg을 더해보자. 누적합 = 10 + 20 = 30
결론 : 누적합 >= 더하는 수 이면 측정가능한 구간이고, 아니면 측정불가능하다.
알고리즘
n = int(input())
arr = list(map(int, input().split()))
arr.sort() # 배열 정렬
target = 1
for i in arr:
if target < i:
break
target += i
print(target)