Leetcode Java Number of Increasing Paths in a Grid
업데이트:
문제
코드
class Solution {
private int mod = 1000000007;
private int[][] directions = new int[][] {
{ 1, 0 },
{ 0, -1 },
{ -1, 0 },
{ 0, 1 }
};
public int countPaths(int[][] grid) {
int row = grid.length;
int col = grid[0].length;
int count = 0;
int[][] dp = new int[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
count = (count + this.getCount(grid, dp, row, col, i, j, 0)) % this.mod;
}
}
return count;
}
private int getCount(int[][] grid, int[][] dp, int row, int col, int i, int j, int prev) {
if (i < 0 || i >= row || j < 0 || j >= col || grid[i][j] <= prev) {
return 0;
} else if (dp[i][j] != 0) {
return dp[i][j];
} else {
int count = 1;
for (int[] direction : this.directions) {
count = (count + this.getCount(grid, dp, row, col, i + direction[0], j + direction[1], grid[i][j])) % this.mod;
}
dp[i][j] = count;
return count;
}
}
}
결과
설명
- $m \times n$ 크기의 grid를 이용하여 임의의 위치에서 시작하고 종료하여 각 셀의 값이 점층적으로 증가하는 모든 경로의 수를 구하는 문제이다.
- 단, 답이 매우 클 수 있으므로 모듈러 $10^9 + 7$을 이용해 계산한다.
- 문제 풀이에 필요한 전역 변수를 정의한다.
- mod는 모듈러를 적용할 변수로, $10^9 +7$로 초기화한다.
- directions는 셀의 상하좌우를 계산하기 위한 배열로, 2차원 정수 배열로 초기화하여 상하좌우에 대한 x와 y축에 대한 가감값으로 이루어진 값들을 넣어준다.
- 문제 풀이에 필요한 변수를 정의한다.
- row와 col은 grid의 행과 열의 수를 저장한 변수이다.
- count는 시작과 종료가 점층적으로 증가하는 형태의 경로의 수를 계산하기 위한 변수로, 0으로 초기화한다.
- dp는 탐색 지점 별 경로의 수를 계산하기 위한 변수로, $row \times col$ 크기의 2차원 정수 배열로 초기화한다.
-
0부터 row까지 i를, 0부터 col까지 j를 순차적으로 증가시키며 count에 count와 5번에서 정의한 getCount(int[][] grid, int[][] dp, int row, int col, int i, int j, int prev) 메서드를 수행한 결과를 더한 후 mod를 나눈 나머지 값을 넣어준다.
- 이전 값이 prev인 위치에서 [i, j] 로 이동했을 때 증가하는 경로의 수를 계산하기 위한 getCount(int[][] grid, int[][] dp, int row, int col, int i, int j, int prev) 메서드를 정의한다.
- i가 [0, $row - 1$] j가 [0, $col - 1$] 범위를 벗어나거나 grid[i][j]의 값이 prev보다 같거나 작은 경우, 이어지는 경로가 없으므로 0을 반환한다.
- 위가 아니면서 dp[i][j]의 값이 0이 아닌 탐색된 경로의 경우, 해당 값을 반환한다.
- 위의 모든 경우가 아니라면 아래를 수행한다.
- count는 경로를 계산할 변수로, 현재 위치까지 경로가 이어졌으므로 1을 넣어 초기화한다.
- directions의 모든 값을 direction에 순차적으로 넣고 재귀 호출을 수행할 때 i, j, prev에 $i + direction[0]$, $j + direction[1]$, grid[i][j]의 값들을 순차적으로 수행한 결과에 count를 더한 후 mod를 나눈 나머지 값을 count에 더해준다.
- dp[i][j] 위치에 count를 넣어 저장한 후, count를 반환한다.
- 반복이 완료되면 계산된 경로의 수인 count를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기