티스토리 뷰
https://www.acmicpc.net/problem/2294
2294번: 동전 2
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어
www.acmicpc.net
1. 접근 방식
- 작은 문제들을 모아 큰 문제를 해결하는 다이나믹 프로그래밍 기법이다
k원을 구성하는 최소 동전들의 개수는 (k - coin)원을 구성하는 최소 동전 + 1이다. 따라서 1원부터 k원까지 점진적으로 각 금액을 구성하는 최소 동전 개수를 구하면 문제를 해결할 수 있다.
- 인덱스 i원을 만드는 최소 동전 개수를 담은 1차원 dp 배열을 선언하자
최소 동전 개수를 구하는 것이므로, 초기값은 임의의 큰 수 99999로 설정한다.
여러 가지 동전들을 조합하여 i원을 만들면, 그때 사용한 동전 개수, 즉 dp[i]는 무조건 99999보단 작다.
만약 동전을 어떻게 조합해도 i원을 만들지 못한다면 dp[i] 값은 여전히 99999일 테고, 결국 동전들로 i원을 만들 수 없다는 의미이므로 dp[i]에 -1을 할당한다.
2. 정답 코드
import sys
input = sys.stdin.readline
INITIAL = 99999
n, k = map(int, input().split())
coins = sorted({int(input()) for _ in range(n)})
dp = [INITIAL] * (k + 1)
dp[0] = 0
for i in range(1, k + 1):
for coin in coins:
if coin > i:
break
if dp[i - coin] > -1:
dp[i] = min(dp[i], dp[i - coin] + 1)
if dp[i] == INITIAL:
dp[i] = -1
print(dp[k])
728x90
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준] 14502번 연구소 파이썬 정답 풀이 (0) | 2024.03.14 |
---|---|
[백준] 15686번 치킨 배달 파이썬 풀이 (0) | 2024.03.13 |
[백준] 1890번 점프 파이썬 풀이 (0) | 2024.03.08 |
[백준] 17144번 미세먼지 안녕! 파이썬 정답 풀이 (0) | 2024.03.08 |
[백준] 14719번 빗물 파이썬 풀이 (0) | 2024.02.14 |