|
" 문제 "
N개의 동전을 이용하여 만들 수 없는 양의 정수 금액 중 최솟값을 구하는 프로그램을 작성하세요.
<입력 조건>
첫째 줄에는 동전의 개수를 나타내는 양의 정수 N이 주어집니다. ( 1 <= N <= 1000 )
둘째 줄에는 각 동전의 화폐 단위를 나타내는 N개의 자연수가 주어지며, 각 자연수는 공백으로 구분합니다. 이때, 각 화폐 단위는 1,000,000 이하의 자연수입니다.
<출력 조건>
첫째 줄에 주어진 동전들로 만들 수 없는 양의 정수 금액 중 최솟값을 출력합니다.
입력예시 | 출력예시 |
5 3 2 1 1 9 |
8 |
" 아이디어 "
주어진 동전 리스트를 오름차순으로 sort() 하고
맨 처음 동전부터 차례대로 동전을 추가해가며 만들 수 없는 금액을 찾는 방식으로 풀이하면 된다.
예를들면,
현재 동전리스트가 1, 1, 2 라면 만들 수 있는 금액은 1~4 원이다.
(쉬운 이해를 위해 이미 루프를 돌아 동전 3개를 추가한 이후라고 가정하였다.)
그 다음 확인해야할 금액 target은 5이다.
전체 동전 리스트가 [1, 1, 2, 2]와 [1, 1, 2, 6] 인경우를 비교해보자.
(1) [1, 1, 2, 2]
이미 1~4인 금액은 만들 수 있으므로 새로 추가할 2 원짜리 동전으로는
1 + 2 = 3
2 + 2 = 4
...
4 + 2 = 6
까지 만들 수 있다.
그러므로 기존 target에 새 동전의 단위를 더하여
target += 2 를 하여 증가시킨다.
그러면 현재 target은 7이 된다.
더이상 추가할 동전이 없으므로
만들 수 없는 최소금액은 7이다.
(2) [1, 1, 2, 6]
이미 1~4인 금액은 만들 수 있으므로 새로 추가할 6원짜리 동전으로는
1 + 6 = 7
...
4 + 6 = 10
까지 만들 수 있다.
이 경우 문제가 있다.
target보다 새로 추가한 동전의 금액이 크다는 점이다.
6원짜리 동전은 단위가 너무 커서 5, 6 을 건너 뛰게된다.
그래서 이 경우, 만들 수 없는 최소금액은 5이다.
이렇게 새로운 동전이 추가되었을 때 이전 target+ 새 동전의 금액 을 하면서 target를 올려나가면 되고,
target보다 새 동전의 단위가 큰 경우 현재 target이 만들 수 없는 금액이 된다.
아래 표를 보면 target이 어떻게 증가하는지 확인할 수 있다.
target (확인하고자 하는 금액) | 새로 추가된 동전 | 현재 동전 리스트 | 만들 수 있는 금액 |
1 | 1 | [ 1 ] | 1 |
1 + 1 = 2 | 1 | [ 1, 1 ] | 1~2 |
2 + 1 = 3 | 2 | [ 1, 1, 2 ] | 1~4 |
3 + 2 = 5 | 6 | [ 1, 1, 2, 6 ] | 1~4 / 7~10 (5, 6이 빠짐) |
" 코드 "
1
2
3
4
5
6
7
8
9
10
11
12
13
|
n = int(input())
coin = list(map(int, input().split()))
coin.sort()
target = 1
for i in coin:
if target < i:
break
target += i
print(target)
|
cs |
" 참고자료 "
'알고리즘 > 기타' 카테고리의 다른 글
[ 이것이 코딩테스트다 ] 왕실의 나이트 - 구현 (시뮬레이션) (0) | 2021.04.03 |
---|---|
[ 이것이 코딩테스트다 ] 볼링공 고르기 - 그리디 알고리즘 (3) | 2021.03.30 |
[ 이것이 코딩테스트다 ] 곱하기 혹은 더하기 - 그리디 알고리즘 (0) | 2021.03.28 |
[ 이것이 코딩테스트다 ] 모험가 길드 - 그리디 알고리즘 (0) | 2021.03.28 |
[ 이것이 코딩테스트다 ] 1이 될 때까지 - 그리디 알고리즘 (0) | 2021.03.26 |