[BOJ] Q2294 동전 2

Question

Language: Python

Difficulty: Gold 5

주어진 동전의 종류를 활용해서 k원을 만들고자 할때, k원을 만들기 위해 사용되는 최소 동전 개수는?

문제의 예저를 통해서 알아보자

1 2 3 4 5 6 7 8 9 10
1 1(2) 2(2+1) 2(2+2) 5(1) 2(5+1) 2(5+2) 3(5+2+1) 3(5+2+2) 2(5+5)

6원을 만들때의 경우를 보자 5원에서 1을 추가하면 6 4원에서 2을 추가하면 6 1원에서 5을 추가하면 6

즉, 1,4,5원을 만드는 경우 중에서 제일 적은 동전의 개수를 활용하는 경우를 구해서 해당 값에 1을 추가하면 6원을 만드는 최소 동전 개수를 구할 수 있다.

이 경우, 5원을 만드는 경우가 1가지로 제일 적으므로, 6원을 만드는 최소 동전의 개수는 2개이다.

각각 k 원에 대해 아래의 DP 연산을 진행하면 된다.

Logic

for i in range(k):
  min_counts=inf
  for money_type in money_types:
    if i-money_type >=0:
      min(min_counts,dp[i-money_type])
    dp[i]=min_counts+1

Solution

from math import inf
def solution():
    dp=[-1] * (k+1)
    dp[0]=0
    
    if k < min(money_types):
        print(-1)
        exit(0)
        
    for i in range(1,k+1):
        temp=inf
        for money_type in money_types:
            prev_step=i-money_type
            if prev_step>=0:
                temp=min(temp,dp[prev_step])

        dp[i]=temp+1
        
    if dp[i]==inf:
        print(-1)
    else:
        print(dp[k]) 
    
if __name__ =="__main__":
    n,k=map(int,input().split())
    money_types=[]
    for _ in range(n):
        money_types.append(int(input().strip()))
    solution()

댓글남기기