-
[프로그래머스] - 거스름돈Algorithm/프로그래머스 2022. 9. 15. 16:21
문제
[프로그래머스] - 거스름돈
https://school.programmers.co.kr/learn/courses/30/lessons/12907
문제 이해
더보기문제 설명
Finn은 편의점에서 야간 아르바이트를 하고 있습니다. 야간에 손님이 너무 없어 심심한 Finn은 손님들께 거스름돈을 n 원을 줄 때 방법의 경우의 수를 구하기로 하였습니다.
예를 들어서 손님께 5원을 거슬러 줘야 하고 1원, 2원, 5원이 있다면 다음과 같이 4가지 방법으로 5원을 거슬러 줄 수 있습니다.
- 1원을 5개 사용해서 거슬러 준다.
- 1원을 3개 사용하고, 2원을 1개 사용해서 거슬러 준다.
- 1원을 1개 사용하고, 2원을 2개 사용해서 거슬러 준다.
- 5원을 1개 사용해서 거슬러 준다.
거슬러 줘야 하는 금액 n과 Finn이 현재 보유하고 있는 돈의 종류 money가 매개변수로 주어질 때, Finn이 n 원을 거슬러 줄 방법의 수를 return 하도록 solution 함수를 완성해 주세요.
제한 사항- n은 100,000 이하의 자연수입니다.
- 화폐 단위는 100종류 이하입니다.
- 모든 화폐는 무한하게 있다고 가정합니다.
- 정답이 커질 수 있으니, 1,000,000,007로 나눈 나머지를 return 해주세요.
입출력 예nmoneyresult5 [1,2,5] 4 - 주의 = 4 인 경우에 112와 121와 211은 모두 동일하게 처리되어야 한다.
- 처음에 DP로 접근 할 때 아이디어는 DP[i][j] , i = 거스름돈 단위 / j = 사용한 동전 갯수 였으나, 3의 경우 파악이 되지 않음으로 사용이 불가하였다.
- 아이디어를 변경하여야 하는데 생각이 나지 않아 combination과 같이 모든 경우의 수를 나타내려고 해보았지만, 나머지로 나누어서 갱신하는 것으로 DP가 맞다고 생각하고 다시 접근
알고리즘
아이디어 = DP[i][j] , i = 현재 거스름돈 index / j = 0~N까지의 모든 돈의 단위
- DP[i][0]은 시작지점으로 1로 초기화 ( 거스름돈 값부터 시작 처리 )
- 거스름돈은 for문을 써서 대체가 가능함으로 memory를 줄이기 위해 1차원으로 변경
1. DP 초기화
2. 매 거스름돈 마다 발생하는 경우의 수 추가
거스름돈 index / 돈 단위 0 1 2 3 4 5 0 (1원) 1 1 1 1 1 1 1 (2원) 1 1 2 2 3 3 2 (5원) 1 1 2 2 3 4 코드
#프로그래머스 - 거스름돈 def solution(n, moneys): moneys.sort() dp = [1]+[0]*n #dp = [0]*(n+1) #dp[0]=1 for money in moneys : for i in range(money,n+1): dp[i]+= dp[i-money] return dp[-1]
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] - 여행경로 (0) 2022.09.16 [프로그래머스] - 섬 연결하기 (0) 2022.09.16 [프로그래머스] - 가장 긴 팰린드롬 (0) 2022.09.15 [프로그래머스] - 단어 변환 (0) 2022.09.14 [프로그래머스] - 단속카메라 (0) 2022.09.14