백준 2293 - 동전 1 (파이썬)
글 작성자: pental

https://www.acmicpc.net/problem/2293
풀이
dp[i][j] → i번까지의 동전을 사용하여 j원을 만드는 경우의 수
점화식
- 동전 i를 사용하지 않는 경우
- dp[i][j] = dp[i - 1][j]
- 동전 i를 사용하는 경우
- dp[i][j] += dp[i][j - V[i]]
- 현재 동전을 사용하면 j - V[i]를 만드는 방법에서 해당 동전을 추가한 방법이 가능
초기에 코드는 다음과 같다.
# 백준 2293 - 동전 1 # 분류 : 다이나믹 프로그래밍 N, K = map(int, input().split()) V = [0] * N for i in range(N) : V[i] = int(input()) # (i, j) : i번 까지의 동전을 사용해서 j원을 만드는 경우의 수 dp = [[0] * (K + 1) for i in range(N)] # dp[0][~] for i in range(K + 1) : if i % V[0] == 0 : dp[0][i] = 1 for i in range(1, N) : for j in range(K + 1) : dp[i][j] = dp[i - 1][j] if j >= V[i] : dp[i][j] += dp[i][j - V[i]] print(dp[N - 1][K])
기존의 2차원 DP테이블을 사용하면 문제에서 주어진 메모리 사용량인 4MB를 초과하게 된다. 따라서 1차원 리스트(prev, curr)을 사용해서 최적화 한다.
- prev[j] → 이전 동전까지 사용하여 j원을 만드는 방법의 수
- curr[j] → 현재 동전까지 사용하여 j원을 만드는 방법의 수
또한 점화식을 1차원으로 변형한다.
curr[j] = prev[j] if j >= V[i]: curr[j] += curr[j - V[i]]
- 기존 dp[i - 1][j]는 prev[j]로 대체
- dp[i][j - V[i]]는 curr[j - V[i]]로 대체
prev = curr
현재 동전(curr)을 업데이트한 후, prev에 저장하여 다음 반복에 사용
코드
# 백준 2293 - 동전 1 # 분류 : 다이나믹 프로그래밍 N, K = map(int, input().split()) V = [0] * N for i in range(N) : V[i] = int(input()) prev = [0] * (K + 1) curr = [0] * (K + 1) for i in range(K + 1) : if i % V[0] == 0 : prev[i] = 1 for i in range(1, N) : for j in range(K + 1) : curr[j] = prev[j] if j >= V[i] : curr[j] += curr[j - V[i]] prev = curr print(prev[K])
이 글은
(새창열림)
본 저작자 표시, 비영리 규칙 하에 배포할 수 있습니다. 자세한 내용은 Creative Commons 라이선스를 확인하세요.
Creative Commons
본 저작자 표시
비영리
'Programming > 백준' 카테고리의 다른 글
백준 14719 - 빗물 (파이썬) (0) | 2025.03.05 |
---|---|
백준 17086 - 아기 상어 2 (파이썬) (0) | 2025.03.04 |
백준 1062 - 가르침 (파이썬) (0) | 2025.03.03 |
백준 6550 - 부분 문자열 (파이썬) (0) | 2025.03.02 |
백준 20442 - ㅋㅋ루ㅋㅋ (0) | 2025.03.01 |
댓글
이 글 공유하기
다른 글
-
백준 14719 - 빗물 (파이썬)
백준 14719 - 빗물 (파이썬)
2025.03.05 -
백준 17086 - 아기 상어 2 (파이썬)
백준 17086 - 아기 상어 2 (파이썬)
2025.03.04 -
백준 1062 - 가르침 (파이썬)
백준 1062 - 가르침 (파이썬)
2025.03.03 -
백준 6550 - 부분 문자열 (파이썬)
백준 6550 - 부분 문자열 (파이썬)
2025.03.02
댓글을 사용할 수 없습니다.