![[BOJ] 백준 2293 동전 1 Python](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDln7a%2FbtsC8Yx7MnR%2FQS78dShyzh4oDwl2QcBhKK%2Fimg.png)
[BOJ] 백준 2293 동전 1 Python알고리즘 & 코테2024. 1. 10. 11:08
Table of Contents
2293번: 동전 1
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다.
www.acmicpc.net
문제풀이
경우의 수 문제이며 메모리 제한과 시간 제한을 따져봤을 때 DP를 사용해서 풀어야함을 알 수 있었다.
k원을 만들기 위해 1 <= i <= k 의 범위 내에서 1원...2원...3원...~...k원이 되는 경우의수를 구해야한다.
또한, dp배열의 인덱스는 i로 i원이 되는 경우의 수는 dp[i]가 된다는 것은 명확하다.
방금 파악한 내용을 바탕으로 입력값 예제에 대한 문제를 해결해보자.
입력예제
3 10
1
2
5
1.
1원으로 k원을 만들 수 있는 경우의 수
1원으로 1원을 만들 수 있는 경우의 수 : 1 → (1)
1원으로 2원을 만들 수 있는 경우의 수 : 1 → (1,1)
.
.
.
1원으로 k원을 만들 수 있는 경우의 수 : 1 → (1,1,1,...,1) <k개의 1>
2.
2원으로 k원을 만들 수 있는 경우의 수
2원으로 2원을 만들 수 있는 경우의 수 : 2 → (1,1),(2)
2원으로 3원을 만들 수 있는 경우의 수 : 2 → (1,1,1),(1,2)
2원으로 4원을 만들 수 있는 경우의 수 : 3 → (1,1,1,1),(1,1,2),(2,2)
2원으로 5원을 만들 수 있는 경우의 수 : 3 → (1,1,1,1,1),(1,1,1,2),(1,2,2)
여기까지 했을 때 이 항들에 대한 점화식을 찾을 수 있었다.
점화식 : dp[i] = dp[i] + dp[i - 동전value] (가능범위 : 동전value <= i <=k )
이 점화식을 토대로 코드를 만들었다.
Code
from sys import stdin
input = stdin.readline
def solve():
coin = []
n, k = map(int, input().split())
for _ in range(n):
coin.append(int(input()))
dp = [0] * (k + 1)
dp[0] = 1
for c in coin:
for i in range(c, k + 1):
dp[i] += dp[i - c]
print(dp[-1])
solve()
'알고리즘 & 코테' 카테고리의 다른 글
[BOJ] 백준 11053 가장 긴 증가하는 부분 수열 Python (0) | 2024.01.11 |
---|---|
[BOJ] 백준 2225 합분해 Python (0) | 2024.01.10 |
[BOJ] 백준 11726 2xn 타일링 Python (0) | 2024.01.09 |
[BOJ] 백준 2579 계단 오르기 Python (1) | 2024.01.09 |
[BOJ] 백준 17298 오큰수 Python (1) | 2024.01.08 |
@Indigochi1d :: Indigochi1d's Commit Log
안녕하세요? 개발자입니다.