[BOJ] Q2293 동전 1
[BOJ] Q2293 동전 1
Question
Language: Python
Difficulty: Gold 5
주어진 동전의 종류를 활용해서 k원을 만들고자 할때, k원을 만들 수있는 동전 조합의 개수는?
문제의 예저를 통해서 알아보자
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|---|
1 이용했을때 | 1 | 1+1 | 1+1+1 | 1+1+1+1 | 1+1+1+1+1 | 1+.. | 1+.. | 1+.. | 1+.. | 1+.. |
2 이용했을때 | 1 | 1+1,2 | 1+1+1,1+2 | 1+1+1+1,1+1+2,2+2 | 1+1+1+1+1,1+1+1+2,1+2+2 | .. | .. | .. | .. | .. |
5 이용했을때 | 1 | 1+1,2 | 1+1+1,1+2 | 1+1+1+1,1+1+2,2+2 | 1+1+1+1+1,1+1+1+2,1+2+2,5 | .. | .. | .. | .. | .. |
잘 보면 규칙성이 보인다
5원을 만들때의 경우를 보자
1을 이용했을때, 5-1(4)원을 만드는 경우에 1을 더하면 5가 된다. 2을 이용했을때, 5-2(3)원을 만드는 경우에 2을 더하면 5가 된다. 5을 이용했을때, 5-5(0)원을 만드는 경우에 5을 더하면 5가 된다.
각각 k 원에 대해 아래의 DP 연산을 진행하면 된다.
Logic
for money_type in money_types:
for i in range(k):
if i-money_type >=0:
dp[i]+=dp[i-money_type]
Solution
def solution():
dp=[0] * (k+1)
dp[0]=1
for money_type in money_types:
for i in range(1,k+1):
prev_step=i-money_type
if prev_step >=0:
dp[i]+=(dp[prev_step])
print(dp[k])
if __name__ =="__main__":
n,k=map(int,input().split())
money_types=[]
for _ in range(n):
money_types.append(int(input().strip()))
solution()
댓글남기기