풀이 과정
- DP를 사용하는 문제일 거 같아서 처음에는 현재 금액 기준으로 도달할 수 있는 모든 경우의 수를 계산하였음.
- dp[i] = dp[i] + dp[i-coin[j]] if (i - coin[j] >= 0)
- dp[0] = 0
- 위와 같은 방법으로 하게 되면 중복에 대한 처리가 전혀 되지 않아서 안되는 것 같았음.
- (1, 2, 2)랑 (2, 1, 1)은 같은 방법
- 고민하다 다른 사람들의 풀이를 보니 동전별로 dp 적용
- 동전 단위로 DP 적용
- dp[i] = dp[i] + dp[coin], 루프를 돌면서 하나의 동전만
- 위처럼 하면 항상 새로운 방식으로만 개수가 세어짐.
- 4라고 가정하고, 동전이 (1,2,4)일 때 위 방식으로 한다면..
- 1, 1, 1, 1
- 1, 1, 2
- 2, 2
- 4
소스 코드
def solution(n, money):
answer = 0
dp = [0] * (n+1)
dp[0] = 1
for m in money:
for i in range(1, n+1):
if i - m >= 0:
dp[i] += dp[i-m]
print(dp, m)
answer = dp[n] % 1000000007
return answer
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
'알고리즘[Python] > 프로그래머스' 카테고리의 다른 글
[ Lv 3 ] N으로 표현 (0) | 2021.07.23 |
---|---|
[ Lv 3 ] 멀리 뛰기 (0) | 2021.07.22 |
[ Lv 3 ] 매칭 점수 (0) | 2021.07.21 |
[ Lv 3 ] 단속카메라 (0) | 2021.07.21 |
[ Lv 3 ] 가장 긴 팰린드롬 (0) | 2021.07.20 |