ํ๋ก๊ทธ๋๋จธ์ค : ๋ฑ๊ตฃ๊น
๊ณ์๋๋ ํญ์ฐ๋ก ์ผ๋ถ ์ง์ญ์ด ๋ฌผ์ ์ ๊ฒผ์ต๋๋ค. ๋ฌผ์ ์ ๊ธฐ์ง ์์ ์ง์ญ์ ํตํด ํ๊ต๋ฅผ ๊ฐ๋ ค๊ณ ํฉ๋๋ค. ์ง์์ ํ๊ต๊น์ง ๊ฐ๋ ๊ธธ์ m x n ํฌ๊ธฐ์ ๊ฒฉ์๋ชจ์์ผ๋ก ๋ํ๋ผ ์ ์์ต๋๋ค.
์๋ ๊ทธ๋ฆผ์ m = 4, n = 3 ์ธ ๊ฒฝ์ฐ์
๋๋ค.
๊ฐ์ฅ ์ผ์ชฝ ์, ์ฆ ์ง์ด ์๋ ๊ณณ์ ์ขํ๋ (1, 1)๋ก ๋ํ๋ด๊ณ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋, ์ฆ ํ๊ต๊ฐ ์๋ ๊ณณ์ ์ขํ๋ (m, n)์ผ๋ก ๋ํ๋
๋๋ค.

๊ฒฉ์์ ํฌ๊ธฐ m, n๊ณผ ๋ฌผ์ด ์ ๊ธด ์ง์ญ์ ์ขํ๋ฅผ ๋ด์ 2์ฐจ์ ๋ฐฐ์ด puddles์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. ์ค๋ฅธ์ชฝ๊ณผ ์๋์ชฝ์ผ๋ก๋ง ์์ง์ฌ ์ง์์ ํ๊ต๊น์ง ๊ฐ ์ ์๋ ์ต๋จ๊ฒฝ๋ก์ ๊ฐ์๋ฅผ 1,000,000,007๋ก ๋๋ ๋๋จธ์ง๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ์ถ๋ ฅ ์
m : 4
n : 3
puddles : [[2, 2]]
return : 4

์ฒ์์๋ ์ต์ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋๊น bfs๋ก ํ์ด์ผํ๋..? ํ๋ค.
๊ทผ๋ฐ ๋ฌธ์ ์ ์๊ตฌ์ฌํญ์ด '์ต์๊ฒฝ๋ก'๊ฐ ์๋๋ผ '์ต๋จ๊ฒฝ๋ก์ ๊ฐ์'์ด๊ธฐ ๋๋ฌธ์, ๊ฒฝ๋ก์ ์๋ฅผ ๋์ ํด์ ๊ณ์ฐํ๋ DP๋ก ํ์ด์ผ ํจ์ ์์๋ค.
์ด ๋ฌธ์ ๋ ๋ค๋ฅธ dp ๋ฌธ์ ์ ๋ค๋ฅธ ์ ์ด ๋ช ๊ฐ์ง ์๋ค.
์ค๊ฐ์ ์ง๋๊ฐ ์ ์๋ ๊ธธ์ธ '์ฐ๋ฌผ'์ด ์กด์ฌํ๋ค. ๋ฐ๋ผ์ ๊ฒฝ๋ก์ ์๋ฅผ ๊ตฌํ ๋, ํด๋น ์ฐ๋ฌผ์ ์ง๋๊ฐ๋ ๊ฒฝ๋ก๋ ์นด์ดํธํ์ง ์๋๋ก ์ฒ๋ฆฌํ๋ค.
๋ณดํต์ 4๋ฐฉํฅ ํ์, 8๋ฐฉํฅ ํ์์ด ์ผ๋ฐ์ ์ด์ง๋ง ์ด ๋ฌธ์ ๋ ์ค๋ฅธ์ชฝ๊ณผ ์๋์ชฝ์ผ๋ก๋ง ์ด๋ํ ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก, ํ์ฌ์์น๊น์ง์ ๊ฒฝ๋ก์ ์๋ ํ์ฌ์์น์์ ํ์นธ ์ผ์ชฝ์ ๊ฒฝ๋ก์ ์ + ํ์ฌ์์น์์ ํ์นธ ์์ชฝ์ ๊ฒฝ๋ก์๊ฐ ๋๋ค.

"์ต๋จ๊ฒฝ๋ก์ ๊ฐ์๋ฅผ 1,000,000,007๋ก ๋๋ ๋๋จธ์ง๋ฅผ returnํด์ผ ํ๋ค."
์์นซํ๋ฉด ์ด ๊ณผ์ ์์ ๋ฒ์ ์ด๊ณผ๊ฐ ๋ ์ ์์ผ๋ ์ด ๋ถ๋ถ์ ์ ๊ณ ๋ คํด์ผ ํ๋ค.
//returnํ ๋ ํ์ํ ๋ณ์ ์์ฑ
int MOD = 1_000_000_007;
//์ง๊น์ง ๊ฐ ์ ์๋ ๊ฒฝ๋ก์ ์๋ฅผ ์ ์ฅํ๋ dp๋ฐฐ์ด ๋ง๋ค๊ธฐ
//๋์ฐฉ์ง์ ์ด (m, n)์ด๊ธฐ ๋๋ฌธ์ ๋ฒ์๋ฅผ +1์ฉ ์ง์ ํ๊ธฐ
int[][] dp = new int[n+1][m+1];
//์ฐ๋ฌผ์ด ์๋ ๊ณณ์ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ ์ ์์ผ๋ฏ๋ก -1๋ก ์ฑ์ฐ๊ธฐ
for (int i = 0 ; i < puddles.length; i++) {
int x = puddles[i][0];
int y = puddles[i][1];
dp[y][x] = -1; //์ธ๋ฑ์ค ์์ ์ฃผ์! [x][y]๋ก ํ๋ฉด ํ๋ฆผ
}
๐จ์ฌ๊ธฐ์ ์ฃผ์ํ ์
๋ฌธ์ ์์ ์์น ํ์๋ฅผ 2์ฐจ์ ๊ฒฉ์ ์์ ํ์ํ๊ณ ์๋๋ฐ, ์ด๋ ์ฝ๋ฉํ ๋ 2์ฐจ์ ๋ฐฐ์ด๊ณผ์ x, y ์ข๋ฃ๊ฐ ๋ฐ๋์ด๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ์ ์กฐ์ฌํ๋๋ก ํ์

๋นจ๊ฐ์ ๋ถ๋ถ์ 2์ฐจ์ ๋ฐฐ์ด์์๋ [1, 2]๋ก ๋ํ๋ด์ง๋ง ๋ฌธ์ ์์๋ [2, 1] ๊ฐ์ด ๋ฐ๋๋ก ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ์กฐ์ฌํ ๊ฒ
//์์์ง์ ์ ๊ฒฝ๋ก์ ๊ฐ์๊ฐ 1์ด๋ฏ๋ก 1๋ก ์ฒ๋ฆฌ
dp[1][1] = 1;
//2์ฐจ์ ๋ฐฐ์ด ๋๊ธฐ
for (int i = 1; i < n +1; i++) {
for (int j = 1; j < m + 1; j++) {
//์์์ง์ ์ด๋ผ๋ฉด ๋์ด๊ฐ๊ธฐ
if (i == 1 && j == 1) continue;
//์ฐ๋ฌผ์ ๋ง๋ฌ๋ค๋ฉด ๋์ด๊ฐ๊ธฐ
if (dp[i][j] == -1) continue;
int down_path = dp[i - 1][j];
int right_path = dp[i][j-1];
//์ฐ๋ฌผ์ ๋ง๋ฌ์ ๋์ ์ฒ๋ฆฌ๋ฐฉ์
if (down_path == -1) {
down_path = 0;
} else if (right_path == -1){
right_path = 0;
}
//ํ์ฌ ์์น์ ๊ฒฝ๋ก์ ์๋ ์ผ์ชฝ ๊ฒฝ๋ก์ ์ + ์์ชฝ ๊ฒฝ๋ก์ ์
dp[i][j] = (down_path + right_path) % MOD;
}
}
โญ๏ธ์ค์ํ ์ง์
๋ฌธ์ ์์ ๋์ฐฉ์ง์ ์ ๊ฒฝ๋ก์ ์์์ 1_000_000_007์ ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ผ๊ณ ํ๋ค.
๋ง์ฝ dp ๋ฐฐ์ด์ ๋ค ๋๊ณ ๋์ฐฉ์ง์ ์์ MOD๋ฅผ ๋๋๋ฉด int ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋งค ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ๋๋ง๋ค MOD๋ฅผ ๋๋์ด ์ ์ฅํด์ฃผ๋ ๊ฒ ์์ ํ๋ค.
๋์ฐฉ์ง์ ์ dp์ ๊ฐ์ return ํ๋ฉด ์ต๋จ๊ฒฝ๋ก์ ๊ฐ์๋ฅผ ๊ตฌํ ์ ์๋ค!
answer = dp[n][m];
return answer;
class Solution {
public int solution(int m, int n, int[][] puddles) {
int answer = 0;
int MOD = 1_000_000_007;
//์ค๋ฅธ์ชฝ๊ณผ ์๋์ชฝ์ผ๋ก๋ง ์์ง์ผ ์ ์๋ค.
//์ง๊น์ง ๊ฐ ์ ์๋ ๊ฒฝ๋ก์ ์๋ฅผ ์ ์ฅํ๋ dp๋ฐฐ์ด ๋ง๋ค๊ธฐ
int[][] dp = new int[n+1][m+1];
//์ฐ๋ฌผ์ด ์๋ ๊ณณ์ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ ์ ์์ผ๋ฏ๋ก -1๋ก ์ฑ์ฐ๊ธฐ
for (int i = 0 ; i < puddles.length; i++) {
int x = puddles[i][0];
int y = puddles[i][1];
dp[y][x] = -1; //์ธ๋ฑ์ค ์์ ์ฃผ์! [x][y]๋ก ํ๋ฉด ํ๋ฆผ
}
//์ฒซ๋ฒ์งธ ๊ฒฝ๋ก 1์ฒ๋ฆฌ
dp[1][1] = 1;
//ํ์ฌ๊น์ง์ ๊ฒฝ๋ก์ ์๋, ์ผ์ชฝ ๊ฒฝ๋ก ์์ + 1, ์์ ๊ฒฝ๋ก ์์ +1 ์ด๋ค.
for (int i = 1; i < n +1; i++) {
for (int j = 1; j < m + 1; j++) {
//์์์ง์ ์ด๋ผ๋ฉด ๋์ด๊ฐ๊ธฐ
if (i == 1 && j == 1) continue;
//์ฐ๋ฌผ์ ๋ง๋ฌ๋ค๋ฉด ๋์ด๊ฐ๊ธฐ
if (dp[i][j] == -1) continue;
int down_path = dp[i - 1][j];
int right_path = dp[i][j-1];
//์ฐ๋ฌผ์ ๋ง๋ฌ์ ๋์ ์ฒ๋ฆฌ๋ฐฉ์
if (down_path == -1) {
down_path = 0;
} else if (right_path == -1){
right_path = 0;
}
dp[i][j] = (down_path + right_path) % MOD;
}
}
answer = dp[n][m];
return answer;
}
}