다이나믹프로그래밍 문제를 항상 피하기만 했는데 자주 풀어서 익숙해져야겠다. 직접 표를 그려서 규칙성을 찾아보면 2차원 dp로 풀이가 가능함을 알 수 있다.
dp[i][j]
는 i개의 화폐를 사용해서 j 금액을 만들 수 있는 갯수다. import java.util.*;
class Solution {
static final int MOD = 1000000007;
public int solution(int n, int[] money) {
int[][] dp = new int[money.length + 1][n + 1];
Arrays.sort(money);
dp[0][0] = 1;
for(int r = 1 ; r < dp.length ; ++r){
for(int c = 0 ; c < dp[0].length ; ++c){
if(c < money[r - 1]){
dp[r][c] = dp[r - 1][c] % MOD;
} else if(c == money[r - 1]){
dp[r][c] = dp[r - 1][c] + 1 % MOD;
} else {
dp[r][c] = dp[r - 1][c] + dp[r][c - money[r - 1]] % MOD;
}
}
}
return dp[money.length][n];
}
}