- μ ν λ€μ΄μΌ μμμ 체μ€μ λμ΄νΈ λ§μ μμ§μ¬μ λ§λ€ μ μλ λ²νΈμ κ²½μ°μ μλ₯Ό ꡬνλ λ¬Έμ .
- λ€μ΄μΌ μμμ λ§μ μμ§μ¬ 보면 μλμ κ°μ΄ λ€μ μ«μλ€μ΄ μ ν΄μ§λ κ²μ μ μ μλ€.
1 β 6, 8 / 2 β 7, 9 / 3 β 4, 8 / 4 β 3, 9, 0 / 5 β μμ /
6 β 1, 7, 0 / 7 β 2, 6 / 8 β 1, 3 / 9 β 2, 4 / 0 β 4, 6
- 첫λ²μ§Έ μ«μλΆν° μμνμ¬ λ€μ μ«μλ‘ κ°λ₯ν κ²½μ°μ μλ₯Ό νμν΄λκ°λ€.
- μ΄ λ κ³μ°ν΄ λ κ²½μ°μ μλ₯Ό matrix
dp
μ κΈ°λ‘ν΄λλ€. - λ²νΈμ μ΅λ κΈΈμ΄κ° 5000, κ° κΈΈμ΄ λ§λ€ μ리μλ 10κ°μ΄λ―λ‘ μ΄ 50000 κ°λ₯Ό κΈ°λ‘ν μ μλ 곡κ°μ΄ νμνλ€.
- μ΄μ°¨νΌ κ° ν
μ€νΈ μΌμ΄μ€ λ§λ€ μ μ₯λλ κ°μ΄ λμΌνκΈ° λλ¬Έμ
static
λ³μλ‘ λλκ² μ 리νλ€.
class Solution {
public:
static constexpr int MOD = 1e9 + 7;
static map<int, vector<int>> nextDigits;
static vector<vector<int>> dp;
int dfs(int n, int digit) {
if (n == 1) return nextDigits[digit].size();
if (dp[n][digit] != -1) return dp[n][digit];
int result = 0;
for (auto nextDigit : nextDigits[digit]) {
result = (result + dfs(n - 1, nextDigit)) % MOD;
}
return dp[n][digit] = result;
}
int knightDialer(int n) {
if (n == 1) return 10;
int result = 0;
for (int i = 0; i <= 9; ++i) {
result = (result + dfs(n - 1, i)) % MOD;
}
return result;
}
};
map<int, vector<int>> Solution::nextDigits = {
{1, {6, 8}},
{2, {7, 9}},
{3, {4, 8}},
{4, {3, 9, 0}},
{5, {}},
{6, {1, 7, 0}},
{7, {2, 6}},
{8, {1, 3}},
{9, {2, 4}},
{0, {4, 6}},
};
vector<vector<int>> Solution::dp(5000, vector<int>(10, -1));