Leetcode Java Rotting Oranges
업데이트:
문제
코드
class Solution {
public int orangesRotting(int[][] grid) {
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == 2) {
this.dfs(grid, i, j, 2);
}
}
}
int minutes = 2;
for (int[] row : grid) {
for (int col : row) {
if (col == 1) {
return -1;
}
minutes = Math.max(minutes, col);
}
}
return minutes - 2;
}
private void dfs(int[][] grid, int i, int j, int minutes) {
if (i >= 0 && i < grid.length && j >= 0 && j < grid[0].length && grid[i][j] != 0 && (grid[i][j] == 1 || grid[i][j] >= minutes)) {
grid[i][j] = minutes;
this.dfs(grid, i - 1, j, minutes + 1);
this.dfs(grid, i + 1, j, minutes + 1);
this.dfs(grid, i, j - 1, minutes + 1);
this.dfs(grid, i, j + 1, minutes + 1);
}
}
}
결과
설명
- 아래의 규칙을 만족하는 grid를 이용하여 신선한 오렌지가 없어질 때 까지 걸리는 시간(분)을 반환하는 문제이다.
- grid 내 값은 아래를 의미한다.
- 0은 빈 셀을 의미한다.
- 1은 신선한 오렌지를 의미한다.
- 2는 썩은 오렌지를 의미한다.
- 매 시간(분) 마다 썩은 오렌지의 4 방향에 존재하는 신선한 오렌지는 썩게된다.
- 신선한 오렌지를 모두 썩게할 수 없다면 -1을 반환한다.
- grid 내 값은 아래를 의미한다.
-
0부터 grid.length 미만까지 i를, 0부터 grid[0].length 미만까지 j를 증가시키며 grid[i][j]의 값이 2인 썩은 오렌지이면 3번에서 정의한 dfs(int[][] grid, int i, int j, int minutes) 메서드를 수행한다.
- DFS 방식으로 신선한 오렌지가 썩을 때 까지 걸리는 시간을 구하기 위한 dfs(int[][] grid, int i, int j, int minutes) 메서드를 정의한다.
- 아래의 조건에 모두 해당하는 경우, 현재 위치에서 4 방향으로 minutes를 1 증가시켜 재귀 호출을 수행한다.
- i와 j가 그리드 내 범위에 있는 경우.
- gird[i][j]의 값이 0이 아닌 경우.
- grid[i][j]의 값이 1인 신선한 오렌지이거나, minutes 이상인 소요 시간(분)이 현재 시간(분) 보다 큰 경우.
- 아래의 조건에 모두 해당하는 경우, 현재 위치에서 4 방향으로 minutes를 1 증가시켜 재귀 호출을 수행한다.
-
minutes는 소요 시간(분)을 저장할 변수로, 2로 초기화한다.
- grid의 모든 값을 순차적으로 아래를 검증한다.
- 하나라도 신선한 오렌지가 존재하면, -1을 주어진 문제의 결과로 반환한다.
- minutes에 minutes와 col 중 큰 값을 저장한다.
- 반복이 완료되면 minutes에서 초기값인 2를 뺀 값을 주어진 문제의 결과로 반환한다.
해설
- minutes를 2로 초기화 하여 계산하는 이유는 썩은 오렌지의 위치에서 시간 계산을 수행할 때, 현재 값 이상으로 적용해야 별도의 배열을 생성하지 않고 grid를 이용하여 내 신선한 오렌지와 빈 칸의 값을 유지하며 시간을 누적 계산 할 수 있다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기