문제 정보

풀이

최단 경로 경우의 수 문제다.

오른쪽 혹은 아래쪽으로만 이동하므로, (i, j)에 도달하는 최단 경로는 반드시 왼쪽 칸 (i, j - 1) 또는 위쪽 칸 (i - 1, j) 에서만 온다. 따라서 dp[i][j]는 다음과 같다.

  • dp[i][j] = dp[i][j - 1] + dp[i - 1][j]

이는 “a → b가 최단이고 b → c가 최단이면 a → c도 최단”이라는 성질을 이용한 것이다.

또한 경로 수가 매우 커질 수 있으므로 매 단계마다 % 1e7을 적용한다.

구현 시 주의할 점은 문제에서 puddles[x, y](열, 행) 순서로 주어지는데, DP 테이블은 dp[행][열]로 구성되어 있으므로 dp[puddle[1]][puddle[0]]으로 저장해야 한다.

코드

import java.util.*;
 
class Solution {
    public int solution(int m, int n, int[][] puddles) {
        int[][] dp = new int[n + 1][m + 1];
        int MOD = 1_000_000_007;
        
        for(int[] puddle : puddles)
            dp[puddle[1]][puddle[0]] = -1;
        
        dp[1][1] = 1;
        for(int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (i == 1 && j == 1)
                    continue;
                
                if (dp[i][j] == -1) {
                    dp[i][j] = 0;
                    continue;
                }
                
                dp[i][j] = (dp[i][j - 1] + dp[i - 1][j]) % MOD;
            }
        }
        
        return dp[n][m];
    }
}