Leetcode Java Unique Paths III
업데이트:
문제
코드
class Solution {
public int uniquePathsIII(int[][] grid) {
int count = 0;
int x = 0;
int y = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == 0) {
count++;
} else if (grid[i][j] == 1) {
x = i;
y = j;
}
}
}
return this.dfs(grid, x, y, count);
}
private int dfs(int[][] grid, int x, int y, int count) {
if (x < 0 || y < 0 || x >= grid.length || y >= grid[0].length || grid[x][y] == -1) {
return 0;
} else if (grid[x][y] == 2) {
return count == -1 ? 1 : 0;
} else {
grid[x][y] = -1;
count--;
int total = this.dfs(grid, x + 1, y, count) + this.dfs(grid, x, y + 1, count) + this.dfs(grid, x - 1, y, count) + this.dfs(grid, x, y - 1, count);
grid[x][y] = 0;
count++;
return total;
}
}
}
결과
설명
-
grid 내 1의 위치에서 2의 위치까지 -1이 있는 칸을 피해 0이 존재하는 칸을 모두 지나갈 수 있는 경우의 수를 구하는 문제이다.
- 문제 풀이에 필요한 변수를 정의한다.
- count는 0의 갯수를 계산하기 위한 변수로, 0으로 초기화한다.
- x와 y는 시작 위치를 저장할 변수로, 0으로 초기화한다.
-
grid의 모든 값을 이용하여 count에 0인 칸의 갯수를, x와 y에 1의 위치를 넣어준다.
-
5번에서 정의한 dfs(int[][] grid, int x, int y, int count) 메서드를 수행한 결과를 주어진 문제의 결과로 반환한다.
- DFS 방식으로 경우의 수를 계산하기 위한 dfs(int[][] grid, int x, int y, int count) 메서드를 정의한다.
- x와 y가 grid 범위를 넘어가거나, -1인 방해물인 경우 0을 반환한다.
- 위의 경우가 아니면서 grid[x][y]의 값이 2인 도착지인 경우, count가 -1이면 1을 아니면 0을 반환한다.
- 위의 모든 경우가 아니라면 아래르 수행한다.
- grid[x][y]에 -1을 넣어 지나간 기록을 남기고 count를 감소시킨다.
- total에 [x, y]의 우측, 위, 좌측, 아래 순으로 재귀 호출을 수행한 결과를 더해서 넣어준다.
- grid[x][y]에 0을 넣어 초기화하고 count를 증가시킨 후 total을 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기