[ νλ‘κ·Έλλ¨Έμ€ / Programmers Level 3 ] 보νμ μ²κ΅
https://programmers.co.kr/learn/courses/30/lessons/1832
μ½λ©ν μ€νΈ μ°μ΅ - 보νμ μ²κ΅
3 3 [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 6 3 6 [[0, 2, 0, 0, 0, 2], [0, 0, 2, 0, 1, 0], [1, 0, 0, 2, 2, 0]] 2
programmers.co.kr
λ¬Έμ μ€λͺ
μΉ΄μΉ΄μ€λ΄λΉ κ°λ°μμΈ μ μ΄μ§λ μλ΄ μ€μ¬κ°μ κ²½λ‘ νμ μκ³ λ¦¬μ¦ κ°λ° μ 무λ₯Ό λ΄λΉνκ³ μλ€. μ΅κ·Ό λ€μ΄ 보νμκ° μμ λ‘κ³ νΈλ¦¬νκ² κ±Έμ μ μλλ‘ λ³΄νμ μ€μ¬μ κ΅ν΅ 체κ³κ° λμ λλ©΄μ λμ¬μ μΌλΆ ꡬμμ μλμ°¨ ν΅νμ΄ κΈμ§λκ³ , μΌλΆ κ΅μ°¨λ‘μμλ 보νμ μμ μ μν΄ μ’νμ μ΄λ μ°νμ μ΄ κΈμ§λκΈ°λ νλ€. 볡μ‘ν΄μ§ λλ‘ νκ²½μΌλ‘ μΈν΄ κΈ°μ‘΄μ κ²½λ‘ νμ μκ³ λ¦¬μ¦μ 보μν΄μΌ ν νμκ° μκ²Όλ€.
λμ μ€μ¬κ°μ μ§λλ m × n ν¬κΈ°μ 격μ λͺ¨μ λ°°μ΄ city_mapμΌλ‘ μ£Όμ΄μ§λ€. μλμ°¨λ μ€λ₯Έμͺ½ λλ μλ λ°©ν₯μΌλ‘ ν μΉΈμ© μ΄λ κ°λ₯νλ€.
city_map[i][j]μλ λλ‘μ μν©μ λνλ΄λ κ°μ΄ μ μ₯λμ΄ μλ€.
- 0μΈ κ²½μ°μλ μλμ°¨κ° μμ λ‘κ² μ§λκ° μ μλ€.
- 1μΈ κ²½μ°μλ μλμ°¨ ν΅νμ΄ κΈμ§λμ΄ μ§λκ° μ μλ€.
- 2μΈ κ²½μ°λ 보νμ μμ μ μν΄ μ’νμ μ΄λ μ°νμ μ΄ κΈμ§λλ€. (μΌμͺ½μμ μ€λ μ°¨λ μ€λ₯Έμͺ½μΌλ‘λ§, μμμ μ€λ μ°¨λ μλμͺ½μΌλ‘λ§ μ§ν κ°λ₯νλ€)
λμμ λλ‘ μνκ° μ λ ₯μΌλ‘ μ£Όμ΄μ‘μ λ, μΌμͺ½ μμ μΆλ°μ μμ μ€λ₯Έμͺ½ μλ λμ°©μ κΉμ§ μλμ°¨λ‘ μ΄λ κ°λ₯ν μ 체 κ°λ₯ν κ²½λ‘ μλ₯Ό μΆλ ₯νλ νλ‘κ·Έλ¨μ μμ±νλΌ. μ΄λ κ°λ₯ν κ²½λ‘μ μλ μ»΄ν¨ν°κ° ννν μ μλ μ μμ λ²μλ₯Ό λμ΄μ€ μ μμΌλ―λ‘, κ°λ₯ν κ²½λ‘ μλ₯Ό 20170805λ‘ λλ λλ¨Έμ§ κ°μ μΆλ ₯νλΌ.
μ λ ₯ νμ
μ λ ₯μ λμμ ν¬κΈ°λ₯Ό λνλ΄λ mκ³Ό n, κ·Έλ¦¬κ³ μ§λλ₯Ό λνλ΄λ 2μ°¨μ λ°°μ΄ city_mapμΌλ‘ μ£Όμ΄μ§λ€. μ ν쑰건μ μλμ κ°λ€.
- 1 <= m, n <= 500
- city_mapμ ν¬κΈ°λ m × nμ΄λ€.
- λ°°μ΄μ λͺ¨λ μμμ κ°μ 0, 1, 2 μ€ νλμ΄λ€.
- μΆλ°μ μ μ’νλ (0, 0), λμ°©μ μ μ’νλ (m - 1, n - 1)μ΄λ€.
- μΆλ°μ κ³Ό λμ°©μ μ city_map[i][j] κ°μ 0μ΄λ€.
μΆλ ₯ νμ
μΆλ°μ μμ λμ°©μ κΉμ§ μ΄λ κ°λ₯ν μ 체 κ²½λ‘μ μλ₯Ό 20170805λ‘ λλ λλ¨Έμ§λ₯Ό 리ν΄νλ€.
νμ΄
DP
λ‘ ν΄κ²°βΌοΈ
3μ°¨μ λ°°μ΄λ‘ μ μΈ
π dp[i][j][0] = (i, j)μ μ μΉΈμμ μ¬ μ μλ κ²½λ‘μ μ
π dp[i][j][1] = (i, j)μ μΌμͺ½ μΉΈμμ μ¬ μ μλ κ²½λ‘μ μ
첫 νμ μλμ°¨ ν΅ν κΈμ§ μΉΈμ μ μΈνκ³ λ μΌμͺ½ β‘οΈ μ€λ₯Έμͺ½ λ§ κ°λ₯νκΈ° λλ¬Έμ [0][i][1] = 1 λ‘ μ΄κΈ°ν
첫 μ΄μ μλμ°¨ ν΅ν κΈμ§ μΉΈμ μ μΈνκ³ λ μ β‘οΈ μλ λ§ κ°λ₯νκΈ° λλ¬Έμ [i][0][0] = 1 λ‘ μ΄κΈ°ν
cityMap[1][1] λΆν° cityMap[m-1][n-1] κΉμ§ μ§ννλ€.
μ€λ₯Έμͺ½ λλ μλ λ°©ν₯μΌλ‘λ§ μ΄λν μ μκΈ° λλ¬Έμ [i-1][j] μ [i][j-1] μ νμΈβΌοΈ
μ½λ
static int MOD = 20170805;
public static int solution(int m, int n, int[][] cityMap) {
int[][][] dp = new int[m][n][2]; // 0 : μ 1 : μΌμͺ½
dp[0][0][0] = 1;
dp[0][0][1] = 1;
// 첫 ν μ΄κΈ°ν -> μΌμͺ½μμλ§ μ¬ μ μμ
for(int i = 1; i < n ; i++){
if(cityMap[0][i] != 1)
dp[0][i][1] = dp[0][i-1][1];
}
// 첫 μ΄ μ΄κΈ°ν -> μμμλ§ μ¬ μ μμ
for(int i = 1; i < m ;i++){
if(cityMap[i][0] != 1)
dp[i][0][0] = dp[i-1][0][0];
}
for(int i = 1; i < m ; i++){
for(int j = 1; j < n ; j++){
// μ μΉΈ
if(cityMap[i-1][j] != 1){
// μ’/μ°νμ λΆκ° -> κ·Έλλ‘ μ μΉΈ
if(cityMap[i-1][j] == 2)
dp[i][j][0] = (dp[i-1][j][0] % MOD);
// νμ κ°λ₯
else
dp[i][j][0] = (dp[i-1][j][0] + dp[i-1][j][1]) % MOD;
}
// μΌμͺ½ μΉΈ
if(cityMap[i][j-1] != 1){
if(cityMap[i][j-1] == 2)
dp[i][j][1] = dp[i][j-1][1];
else
dp[i][j][1] = (dp[i][j-1][0] + dp[i][j-1][1]) % MOD;
}
}
}
return (dp[m-1][n-1][0] + dp[m-1][n-1][1]) % MOD;
}