- ν¬κΈ°κ°
m x n
μΈ κ³΅κ°μ΄ μ‘΄μ¬ν λ νΉμ μμΉ (startRow, startColumn)
μμ μ΅λ maxMove
ν λ§νΌ μμ§μμ λ ν΄λΉ 곡κ°μμ λ²μ΄λ μ μλ κ²½μ°μ μλ₯Ό ꡬνλ λ¬Έμ .
- μ°μ μ΅λ μμ§μΌ μ μλ νμκ°
0
μΈ κ²½μ°λ λ΅μ΄ μλ κ²μ΄ λͺ
ννκΈ° λλ¬Έμ μ μΈνλ€.
- νμ¬ μμΉλ₯Ό κΈ°μ€μΌλ‘ λ, μ, λ¨, λΆ κ° λ°©ν₯μΌλ‘ νμνλ©΄μ κ³΅κ° μΈλΆλ‘ λλ¬νλ κ²½μ°μ μλ₯Ό μ°Ύλλ€.
- μ
(-1, 0)
, λ (1, 0)
, λΆ (0, -1)
, λ¨ (0, 1)
κ° λ°©ν₯μ λν μμ§μμ 미리 λ°°μ΄ delta
μ λ΄μλλ€. - 곡κ°μμ λ²μ΄λ κ²½μ°μλ μ ν¨ν κ²°κ³Όμ΄λ―λ‘ κ°μ
1
λ‘ νλ€. - λ μ΄μ μμ§μΌ μ μλ κ²½μ°
move == 0
μλ κ°μ 0
μΌλ‘ νλ€. - κ° λ°©ν₯μΌλ‘ μλνμ¬ κ³΅κ°μμ λ²μ΄λ κ²½μ°μ μλ₯Ό λͺ¨λ λνλ€.
- νμ¬κΉμ§ μμ§μΈ νμ
move
+ νμ¬ μμΉ (i, j)
λ³λ‘ κ³΅κ° μΈλΆμ λλ¬νλ κ²½μ°μ μλ λ§€λ² κ³μ°ν΄λ λμΌνκ² λμ€κΈ° λλ¬Έμ memoizationμ νμ©νλ€. - 3μ°¨μ λ°°μ΄
dp
μ μμ±νμ¬ νμ¬κΉμ§ μμ§μΈ νμ move - 1
, x μ’ν i
, y μ’ν j
λ³λ‘ κ³΅κ° μΈλΆμ λλ¬νλ κ²½μ°μ μλ₯Ό μ μ₯νλ€. - μ΄λ―Έ μ μ₯λ κ²½μ°μ μ
dp[move - 1][i][j]
κ° μλ€λ©΄ κ³μ°νμ§ μκ³ λ°λ‘ κ°μ κΊΌλ΄μ λλ €μ€λ€.
class Solution {
final int MOD = 1_000_000_000 + 7;
final int[][] delta = new int[][] {
{-1, 0},
{ 1, 0},
{ 0, -1},
{ 0, 1},
};
int traverse(int[][][] dp, int i, int j, int move) {
if (i < 0 || j < 0 || i >= dp[0].length || j >= dp[0][0].length) {
return 1;
} else if (move == 0) {
return 0;
} else if (dp[move - 1][i][j] != -1) {
return dp[move - 1][i][j];
}
int result = 0;
for (int[] d : delta) {
result = (result + traverse(dp, i + d[0], j + d[1], move - 1)) % MOD;
}
return dp[move - 1][i][j] = result;
}
public int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
if (maxMove == 0) {
return 0;
}
int[][][] dp = new int[maxMove][m][n];
for (int[][] sub : dp) {
for (int[] subsub : sub) {
Arrays.fill(subsub, -1);
}
}
return traverse(dp, startRow, startColumn, maxMove);
}
}
- dp μ΄κΈ°ν λΆλΆμμ streamμ νμ©νλ©΄ λ μ½λκ° κΉλν΄μ§κΈ°λ νμ§λ§ μ±λ₯ μ°¨μ΄κ° κ½€ μμ΄μ for loop λ°©μμ μ¬μ©νλκ² λ λ«λ€.
class Solution {
... omitted ..,
public int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
if (maxMove == 0) {
return 0;
}
int[][][] dp = new int[maxMove][m][n];
Arrays.stream(dp)
.flatMap(Arrays::stream)
.forEach((a) -> Arrays.fill(a, -1));
return traverse(dp, startRow, startColumn, maxMove);
}
}