만들 수 없는 금액 코드 및 해설 (파이썬)
2021. 8. 16. 15:40ㆍalgorithm
반응형
출처: 이것이 취업을 위한 코딩 테스트다 with 파이썬, Q 4, p 314
먼저 주어진 동전으로 만들 수 있는 모든 금액을 구한 후, 이중 불연속인 구간을 찾아 만들 수 없는 금액의 최솟값을 구합니다.
만들 수 있는 모든 금액을 구할 때는 possible_amount라는 함수를 만들어 사용했습니다. 오름차순으로 정렬된 동전의 리스트가 입력으로 주어지면, 첫 번째 두 개의 동전과 그 두 개의 동전의 합으로 이루어진 집합을 만듭니다. 이후 세 번째 동전부터 모든 동전을 하나씩 살피면서 지금까지 만들어진 집합 amounts의 모든 값에 현재 동전의 값을 더한 값을 집합에 추가합니다. 이후 amounts 집합을 리스트로 변환해 반환합니다.
이렇게 얻은 만들 수 있는 모든 금액 중에서 1이 없으면 정답으로 1을 반환합니다. 1이 있다면 숫자의 연속성이 끊기는 구간을 찾아 그 구간의 마지막 숫자에 1을 더한 값을 최종 정답으로 반환합니다.
import sys
N = sys.stdin.readline()
coins = list(map(int, sys.stdin.readline().split()))
coins.sort()
# 주어진 동전으로 만들 수 있는 모든 금액을 구함
def possible_amount(coins):
first2 = coins[:2]
# 가장 금액이 작은 두 동전으로 이루어진 집합
amounts = set(first2)
# 가장 금액이 작은 두 동전의 합
amounts.add(sum(first2))
# 세 번째 동전부터 하나씩 꺼내면서, 각 amount 값에 동전 금액 만큼 더함
for i in range(len(coins[2:])):
amounts |= set([a + coins[i+2] for a in amounts])
return list(amounts)
possibles = possible_amount(coins)
# 가장 작은 만들 수 있는 금액
prev = possibles.pop(0)
# 1이 아니면 1원을 만들 수 없는 거니까 1을 프린트
if prev != 1:
print(1)
else:
for p in possibles:
# 연속된 숫자가 아니면
if prev + 1 != p:
print(prev+1)
break
else:
prev += 1
반응형
'algorithm' 카테고리의 다른 글
백준 럭키 스트레이트 코드 및 해설 (파이썬) (0) | 2021.08.24 |
---|---|
볼링공 고르기 코드 및 해설 (파이썬) (0) | 2021.08.16 |
백준 뒤집기 코드 및 해설 (파이썬) (0) | 2021.08.16 |
곱하기 혹은 더하기 코드 및 해설 (파이썬) (0) | 2021.08.16 |
모험가 길드 코드 및 해설 (파이썬) (0) | 2021.08.16 |