[백준] 2294 동전2

백준 2294 동전2

문제

n가지 종류의 동전이 있다.

이 동전들을 적당히 사용해 그 가치의 합이 k원이 되도록 하고싶다.

각각의 동전은 몇 개라도 사용할 수 있다.

사용한 동전의 최소 개수를 계산하는 프로그램을 작성하시오.

입력

  • 첫째 줄: n, k
  • 둘째 줄 ~ : 동전의 가치

출력

사용한 동전의 최소 개수

해결 방식

dp 알고리즘 이용

  • dp[i]에 dp[i]원을 구성하는 동전의 최소 개수를 저장

과정

15원을 1, 5, 12원으로 구성할 경우

1. dp[1]

  • 1원을 추가할 경우 = dp[0] (0) + 1 = 1
  • 5원을 추가할 경우: 불가능
  • 12원을 추가할 경우: 불가능
  • 1개의 동전으로 구성하는 경우가 최소 개수

2. dp [2]

  • 1원을 추가할 경우: dp[1] (1) + 1 = 2
  • 5원을 추가할 경우: 불가능
  • 12원을 추가할 경우: 불가능
  • 2개의 동전으로 구성하는 경우가 최소 개수

5. dp[5]

  • 1원 동전을 추가할 경우: dp[4] (4) + 1 = 5
  • 5원 동전을 추가할 경우: dp[0] (0) + 1 = 1
  • 12원을 추가할 경우: 불가능
  • 5원 동전을 추가하는 경우가 최소 개수

6. dp[6]

  • 1원 동전을 추가할 경우: dp[5] (1) + 1 = 2
  • 5원 동전을 추가할 경우: dp[1] (1) + 1 = 2
  • 12원을 추가할 경우: 불가능
  • 5원 동전을 추가하는 경우가 최소 개수

14. dp[14]

  • 1원 동전을 추가할 경우: dp[13] (2) + 1 = 3
  • 5원 동전을 추가할 경우: dp[9] (5) + 1 = 6
  • 12원 동전을 추가할 경우: dp[2] (2) + 1 = 3
  • 3개의 동전으로 구성하는 경우가 최소 개수

15. dp[15]

  • 1원 동전을 추가할 경우: dp[14] (3) + 1 = 4
  • 5원 동전을 추가할 경우: dp[10] (2) + 1 = 3
  • 12원 동전을 추가할 경우: dp[3] (3) + 1 = 4
  • 3개의 동전으로 구성하는 경우가 최소 개수

코드

import sys
input = sys.stdin.readline

n, k = map(int, input().split())
coins = []
dp = [0] * (k+1)

for _ in range(n):
    coins.append(int(input()))

for i in range(1, k+1):
    comparison = []
    for coin in coins:
        if i >= coin and dp[i - coin] != -1:
            comparison.append(dp[i - coin])
        if not comparison:
            dp[i] = -1
        else:
            dp[i] = min(comparison) + 1

print(dp[-1])

homebdy
homebdy 개발에 이제 막 발 담근 사람. 개발에 이제 막 발 담근 사람. 개발에 이제 막 발 담근 사람. 개발에 이제 막 발 담근 사람.
comments powered by Disqus