코딩테스트

[파이썬(python)] 이것이 취업을 위한 코딩테스트다 효율적인 화폐 구성

고후 2022. 3. 15. 21:06

오랜만에 다이나믹 프로그래밍

 

엇!

답이 맞는줄 알았는데 잘보니 틀리다.

won[i]는 i원을 만들 수 있는 코인의 최소 개수를 저장해야하는데,

아래의 경우... 최소 개수를 저장하지 않는다는 문제가 있다.

초기화할때 -1로 모두 저장해버려서 최소값을 저장하게 되면 그냥 -1이 저장되기 때문이다..

 

import sys

n, m = map(int, sys.stdin.readline().rstrip().split())
coin = []
coin.sort()
for _ in range(n):
    coin.append(int(sys.stdin.readline().rstrip()))

won = [-1] * (m+1)

for i in coin:
    if i <= m:
        won[i] = 1

for i in range(m+1):
    if won[i] == 1:
        continue

    for j in coin:
        if 0 <= i-j <= m:
            if won[i-j] != -1:
                won[i] = won[i-j] + 1
                #이부분이 과연 won[i]값에 최소 화폐의 개수가 저장되는지 의구심이 듬..

print(won[m])

 

그래서

초기화 할 때

불가능한 큰 값으로 저장해줘야한다.

이렇게 하니까 정답!

 

import sys
n, m = map(int, sys.stdin.readline().rstrip().split())
coin = []

for _ in range(n):
    coin.append(int(sys.stdin.readline().rstrip()))

coin.sort()

won = [10000] * (m+1)

for i in coin:
    if i <= m:
        won[i] = 1

for i in range(m+1):
    if won[i] != 10000:
        continue
    
    for j in coin:
        if 0 <= i-j <= m:
            if won[i-j] != 10000:
                won[i] = min(won[i-j]+1, won[i])

if d[m] == 10000:
    print(-1)
else:
    print(d[m])