본문 바로가기

Coding Test/BOJ

[백준/Python] 2294 동전 2

문제 링크

 

2294번: 동전 2

첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어

www.acmicpc.net

 

문제 풀이

  • 동전이 1만 있다면 다음과 같이 작성할 수 있다.
n 0 1 2 3 4 5 ... 14 15
dp[n] 0 1 2 3 4 5 ... 14 15
  • 동전이 1, 5가 있다면 5이상부터는 값이 달라진다.
n 0 1 ... 5 6 7 ... 14 15
dp[n] 0 1 ... 1 2 3 ... 6 3
  • n이 5일 때, 1을 5번 사용하는 것보다 5를 1번 사용하는 것이 최소로 사용하기 때문이다.
  • 각 동전의 값부터 시작하여 계산한다. 현재 위치(i)에서 동전 값(coin)만큼 뺀 위치(i-coin)의 값(dp[i-coin])에서 1을 더한 값과 현재 위치의 값(dp[i])를 비교하여 더 작은 값을 저장하도록 한다.

 

전체 코드

import sys

n, k = map(int, sys.stdin.readline().split())
coins = [int(sys.stdin.readline().strip()) for _ in range(n)]

dp = [100001] * (k+1)
dp[0] = 0

for coin in coins:
    for i in range(coin, k+1):
        dp[i] = min(dp[i], dp[i-coin] + 1)

if dp[-1] == 100001:
    print(-1)
else:
    print(dp[-1])
반응형

'Coding Test > BOJ' 카테고리의 다른 글

[백준/Python] 14502 연구소  (0) 2024.03.28
[백준/Python] 19539 사과나무  (0) 2024.03.22
[백준/Python] 15686 치킨 배달  (0) 2024.03.20
[백준/Python] 2230 수 고르기  (0) 2024.03.15
[백준/Python] 2251 물통  (2) 2024.03.14