k
κ°μ λ©΄μ κ°μ§ n
κ°μ μ£Όμ¬μλ₯Ό κ΅΄λ €μ λμ¨ λμ ν©μΌλ‘ μ£Όμ΄μ§ μ«μ target
μ λ§λ€ μ μλ κ²½μ°μ μλ₯Ό ꡬνλ€.
- μ£Όμ¬μλ₯Ό νλμ© λμ§λ©΄μ λμ¨ μ«μμ λ°λΌ
target
μ κ°μ μν€λ©΄μ κ²°κ³Όμ μΌλ‘ 0
μ΄ λ λκΉμ§ νμμ μ§ννλ€. n
κ°μ μ£Όμ¬μ μ€ μ²«λ²μ§Έ μ£Όμ¬μλ₯Ό λμ‘μ λ 1 ~ k
κΉμ§μ μ«μκ° λ±μ₯νλ κ²½μ°μ μκ° μ‘΄μ¬νλ©° κ°κ°μ λν΄μ λλ¨Έμ§ n - 1
κ°μ μ£Όμ¬μλ₯Ό λμ Έμ λμ ν©μ΄ target - λμ¨ μ«μ
κ° λλλ‘ νλ©΄ λλ€. - λ§μΌ
target
μ΄ 0
λ³΄λ€ μμ κ²½μ° μλͺ»λ μ‘°ν©μ ν΄λΉλλ―λ‘ κ²½μ°μ μλ 0
μ΄λ€. - λ§μ°¬κ°μ§λ‘ λ¨μμλ μ£Όμ¬μμ μκ° μλλ°
target
μ΄ 0
μ΄ μλ κ²½μ°μλ μλͺ»λ μ‘°ν©μ ν΄λΉλλ―λ‘ κ²½μ°μ μλ 0
μ΄λ€. - λ¨μμλ μ£Όμ¬μμ μλ μκ³
target
λ 0
μ΄λΌλ©΄ λ€λ₯Έ κ²½μ°μ μκ° μμΌλ―λ‘ κ²°κ³Όλ 1
μ΄ λλ€.
- νΉμ κ°μμ μ£Όμ¬μλ‘ νΉμ
target
μ«μλ₯Ό λ§λλ κ²½μ°μ μλ νμ λμΌνλ―λ‘ memoizationμ ν΅ν΄μ κ³μ° μλλ₯Ό λμΈλ€. - μ΄ λ λ‘μ§μ λ¨μννκΈ° μν΄μ μ£Όμ¬μμ μκ°
0
μ΄λ©΄μ target
κ°μ΄ 0
μ΄ μλ κ²½μ°λ 미리 κ°μ 0
μΌλ‘ μ΄κΈ°ν ν΄λλ€. - μ£Όμ¬μμ μκ°
0
μ΄λ©΄μ target
κ°μ΄ 0
μ΄ μλ κ²½μ°λ 미리 κ°μ 1
λ‘ μ΄κΈ°ν ν΄λλ€.
class Solution {
final int MOD = 1_000_000_000 + 7;
int traverse(int n, int k, int target, int[][] dp) {
if (target < 0) return 0;
if (dp[n][target] != -1)
return dp[n][target];
int result = 0;
for (int i = 1; i <= k; ++i) {
result = (result + traverse(n - 1, k, target - i, dp)) % MOD;
}
return dp[n][target] = result;
}
public int numRollsToTarget(int n, int k, int target) {
int[][] dp = new int[n + 1][target + 1];
for (int[] sub : dp) {
Arrays.fill(sub, -1);
}
Arrays.fill(dp[0], 0);
dp[0][0] = 1;
return traverse(n, k, target, dp);
}
}