큰 어려움 없이 푼 문제이다. 개인적으로 이 문제보다 DP 실버1 문제들이 더 어려웠던거 같다.
n가지 동류의 동전
, 가치의 합이 k원이 되도록
, 동전의 개수가 최소
이 3가지를 보면 해당 문제를 DP로 풀어야하는 것은 금방 알 수 있다.
동전 종류의 갯수 n과 타겟이 되는 k의 범위를 보면 1<=n<=100, 1<=k<=10000
이므로 머리에 떠오르는대로 단순하게 풀어도 시간 초과를 발생하지 않을거라고 생각해서 아래와 같은 과정으로 문제를 접근했다.
이 문제는 글로 보는 것보단 코드를 보는 것이 이해가 쉬울 것 같다.
풀이 코드
import sys
input = lambda: sys.stdin.readline().rstrip()
n, k = map(int, input().split())
dp = [int(1e9)]*(100001) # i원을 만들 때 사용되는 동전의 갯수
coin = [] # n개 동전의 가치를 저장할 리스트
for _ in range(n):
c = int(input())
coin.append(c)
dp[c] = 1
s = min(coin) # 시작점
for i in range(s, k+1):
if dp[i] == 0: # dp[i]가 0이라면 i원은 동전의 조합으로 만들지 못하는 액수이기에 건너뛰기
continue
for c in coin: # 모든 동전을 돌며 동전 갯수의 최솟값 찾기
if (i+c)<=k:
dp[i+c] = min(dp[i]+1, dp[i+c])
if dp[k] == int(1e9): # k원을 만들지 못하는 경우 -1 출력
print(-1)
else:
print(dp[k])
결과