Coding Test/이것이 코딩 테스트다

[이코테 Greedy] 만들 수 없는 금액

Lucian_Cho 2021. 1. 8. 21:09

# 문제

동네 편의점의 주인인 동빈이는 N개의 동전을 가지고 있습니다. 이때 N개의 동전을 이용하여 만들수 없는 양의 정수 금액 중 최솟값을 구하는 프로그램을 작성하세요.

# 입력조건

  • 첫째 줄에는 동전의 개수를 나타내는 양의 정수 N이 주어집니다. (1 <= N <= 1,000)
  • 둘째 줄에는 각 동전의 화폐 단위를 나타내는 N개의 자연수가 주어지며, 각 자연수는 공백으로 구분합니다. 이때, 각 화폐 단위는 1,000,000 이하의 자연수 입니다.

# 출력조건

  • 첫째 줄에 주어진 동전들로 만들 수 없는 양의 정수 금액 중 최솟값을 출력합니다.

# 입력 예시

5 3 2 1 1 9

# 출력 예시

8

 


내 풀이
from itertools import combinations

n = int(input())
coins = list(map(int, input().split()))

values = set()  # 주어진 동전들로 만들 수 있는 금액들을 담을 집합

# 주어진 동전들 중 1개 ~ N개를 뽑아 만들 수 있는 모든 경우의 수를 구함
for i in range(1, n + 1):
    data = combinations(coins, i)
    # 구한 경우의 수의 해당하는 동전으로 만들 수 있는 금액을 values에 담음(집합이므로 중복 되지 않게 저장됨)
    for case in data:
        values.add(sum(case))

# 집합을 list화 하여 적은 금액 순으로 정렬함
values_list = list(values)
values_list.sort()

result = 1  # 1원부터 비교

# 주어진 동전들로 만들 수 있는 모든 금액에 포함되지 않는 최저 금액을 구함
while True:
    if result not in values_list:
        break
    result += 1

print(result)

 

지향할 답안
n = int(input())
data = list(map(int, input().split()))
data.sort()

target = 1
for x in data:
    # 만들 수 없는 금액을 찾았을 때 반복 종료
    if target < x:
        break
    target += x

# 만들 수 없는 금액 출력
print(target)

 

문제점
 논리적이지만 모범 답안에 비해 너무 긴 점이 아쉽다. 그런데 진짜 문제는 지향할 답안이 이해가 안간다.