[백준 파이썬] 2293 동전 1

https://www.acmicpc.net/problem/2293

 

2293번: 동전 1

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

www.acmicpc.net

 

문제

etc-image-0

 

주어진 동전을 합해서 원하는 숫자를 만드는 경우의 수를 구하는 문제이다.


풀이

경우의 수를 구해야 하기 때문에 Dp를 사용하여 해결하였다.

 

1차원 배열에 동전마다 가능한 경우의 수를 누적하면서 구하는 방식으로 해결하였다.

 

DP[N]은 N을 만들기 위해 필요한 경우의 수이다.

예를들어 1로만 이루어진 동전으로 1~N개의 숫자를 만드는 경우의수를 구할 때

DP[1] ~ DP[N] 값은 모두 1이 된다. 

1 = 1

1 + 1 = 2

1 + 1 + 1 = 3

이렇게 경우의 수가 한가지만 나오기 때문이다.

 

이 방식을 이용해서 DP값을 누적해주면 된다

for c in coins:
    for i in range(c, k + 1):
        DP[i] += DP[i - c]

만약 1, 2로 구성된 동전에서 DP[3]을 구하기 위해서는 

기존 1로만 이루어진 DP[3] = 1에서 1, 2 동전 두개로 구성하기 위해

DP[3] = DP[3](기존) + DP[3 - 2] (기존 DP[1]에서 2동전을 추가한 경우) 이다.

 

해당 방법을 동전의 종류만큼 반복하면 모든 경우의 수를 구할 수 있게된다.

 

 

코드

n, k = map(int, input().split())

coins = []
for i in range(n):
    coins.append(int(input()))
coins.sort()

DP = [0] * (k + 1)
DP[0] = 1
for c in coins:
    for i in range(c, k + 1):
        DP[i] += DP[i - c]
print(DP[k])