물에 잠긴 칸을 피하면서 학교까지 도달하는 "최단 경로의 개수" 구하기
경우의 수를 구하는 문제는
가장 먼저 다이나믹 프로그래밍으로 풀 수 있는지를 확인해야 합니다.
2차원의 공간이 주어지고 이 행과 열의 최대는 이고
오른쪽과 아래로만 이동하기 떄문에 순회하면서
으로 해결할 수 있습니다.
outbound를 해결하기 위해
dp의 행은 n+1 열은 m+1로 생성합니다.
int[][] dp = new int[n+1][m+1];
또한 웅덩이를 피해가야 하므로
dp배열에 웅덩이가 있는 좌표에 -1로 초기화 합니다.
for (int[] puddle : puddles) {
dp[puddle[1]-1][puddle[0]-1] = -1;
}
또한 시작지점인 에서 시작하므로 1로 초기화 합니다.
dp[0][0] = 1;
현재 위치 에서:
로 이동하면서 경로를 누적하는 점화식은 아래와 같습니다.
다만 물웅덩이인 경우는 건너뜁니다.
이 문제는 결과값을 로 나눠야 합니다.
잊지말고 점화식에 추가해야 합니다.
또한 현재 좌표가 웅덩이인 경우는 생략하고
이동할 좌표가 웅덩이인 경우도 생략하도록 구현해야 합니다.
import java.util.*;
class Solution {
static final int DIV = 1000000007;
public int solution(int m, int n, int[][] puddles) {
int[][] dp = new int[n+1][m+1];
for (int[] puddle : puddles) {
dp[puddle[1]-1][puddle[0]-1] = -1;
}
dp[0][0] = 1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (dp[i][j] == -1) continue;
if (dp[i][j+1] != -1) {
dp[i][j+1] = (dp[i][j+1] + dp[i][j]) % DIV;
}
if (dp[i+1][j] != -1) {
dp[i+1][j] = (dp[i+1][j] + dp[i][j]) % DIV;
}
}
}
return dp[n-1][m-1];
}
}