본문 바로가기

Study/Algorithm

[Level 3] 3. 거스름돈 경우의 수

3. 거스름돈 경우의 수


Algorithm - Level 3


- 풀이


1. 이 문제도 Dynamic Programming으로 접근가능하다.


2. n+1 크기의 배열을 선언한다.


3. 1부터 n까지 원소를 0으로 초기화한다.

-> 만약, 화폐단위 중 1이 존재하면 모든 원소를 1로 초기화한다.


5. 화폐단위와 같은 거스름돈은 (n=5, money=5) 경우의 수를 1 증가한다.


6. 그 외는 n까지의 인덱스를 차례로 접근해 작은 화폐단위를 뺀 인덱스의 원소값을 더해준다.

-> ex) money=2, index=5일 경우, 5-2=3 index에 위치한 원소값을 더해준다.


이는 그 전에 계산한 경우의 수를 더해주는 것으로 거스름돈이 5인 경우의 수는 money=2를 하나 선택하고 남은 돈 3의 경우의 수와 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
int solution(int n, vector<int> money) {
    int answer = 0;
    vector<int> dp(n+10);
    
    sort(money.begin(), money.end());
    
    for(int i=0; i<money.size(); ++i){
        for(int j=1; j<dp.size(); ++j){
            if(money[i]==|| money[i]==1)
                dp[j] += 1;
            else if(j >= money[i])
                dp[j] = (dp[j] + dp[j-money[i]]) % 1000000007;
        }
    }
    
    answer = dp[n];
    return answer;
}
cs


'Study > Algorithm' 카테고리의 다른 글

[Level 3] 5. 야근 지수 알고리즘  (0) 2018.08.14
[Level 3] 4. 멀리 뛰기  (0) 2018.08.09
[Level 3] 2. Palindrome  (0) 2018.08.06
[Level 3] 1. 2xN 타일링  (0) 2018.08.02
[Level 2] 12. N개의 최소공배수  (0) 2018.08.01