https://programmers.co.kr/learn/courses/30/lessons/1832
๋ฌธ์ ์ค๋ช
์นด์นด์ค๋ด๋น ๊ฐ๋ฐ์์ธ ์ ์ด์ง๋ ์๋ด ์ค์ฌ๊ฐ์ ๊ฒฝ๋ก ํ์ ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ฐ ์ ๋ฌด๋ฅผ ๋ด๋นํ๊ณ ์๋ค. ์ต๊ทผ ๋ค์ด ๋ณดํ์๊ฐ ์์ ๋กญ๊ณ ํธ๋ฆฌํ๊ฒ ๊ฑธ์ ์ ์๋๋ก ๋ณดํ์ ์ค์ฌ์ ๊ตํต ์ฒด๊ณ๊ฐ ๋์ ๋๋ฉด์ ๋์ฌ์ ์ผ๋ถ ๊ตฌ์ญ์ ์๋์ฐจ ํตํ์ด ๊ธ์ง๋๊ณ , ์ผ๋ถ ๊ต์ฐจ๋ก์์๋ ๋ณดํ์ ์์ ์ ์ํด ์ขํ์ ์ด๋ ์ฐํ์ ์ด ๊ธ์ง๋๊ธฐ๋ ํ๋ค. ๋ณต์กํด์ง ๋๋ก ํ๊ฒฝ์ผ๋ก ์ธํด ๊ธฐ์กด์ ๊ฒฝ๋ก ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ณด์ํด์ผ ํ ํ์๊ฐ ์๊ฒผ๋ค.
๋์ ์ค์ฌ๊ฐ์ ์ง๋๋ 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;
}