[JS] Rotting Oranges
2022. 7. 30. 13:17
🔒 문제 (LeetCode 994)
You are given an m x n grid where each cell can have one of three values:
- 0 representing an empty cell,
- 1 representing a fresh orange, or
- 2 representing a rotten orange.
Every minute, any fresh orange that is 4-directionally adjacent to a rotten orange becomes rotten.
Return the minimum number of minutes that must elapse until no cell has a fresh orange. If this is impossible, return -1.
Constraints:
- m == grid.length
- n == grid[i].length
- 1 <= m, n <= 10
- grid[i][j] is 0, 1, or 2.
🌊 입출력
Example 1:
Input: grid = [[2,1,1],[1,1,0],[0,1,1]]
Output: 4
Example 2:
Input: grid = [[2,1,1],[0,1,1],[1,0,1]]
Output: -1
Explanation: The orange in the bottom left corner (row 2, column 0) is never rotten, because rotting only happens 4-directionally.
Example 3:
Input: grid = [[0,2]]
Output: 0
Explanation: Since there are already no fresh oranges at minute 0, the answer is just 0.
🔑 해결
🌌 알고리즘 - BFS
/**
* @param {number[][]} grid
* @return {number}
*/
var orangesRotting = function(grid) {
const m = grid.length;
const n = grid[0].length;
let q = [];
let cntFresh = 0;
const dir = [[1, 0], [0, 1], [-1, 0], [0, -1]];
for(let i = 0; i < m; i++) {
for(let j = 0; j < n; j++) {
if(grid[i][j] === 2) q.push([i, j]);
else if(grid[i][j] === 1) cntFresh++;
}
}
if(!cntFresh) return 0;
let step = -1;
while(q.length) {
let next = [];
step++;
const len = q.length;
// 큐의 모든 요소를 꺼내서 한번에 2로 만들기
for(let i = 0; i < len; i++) {
const [r, c] = q.shift();
dir.forEach(d => {
const [nr, nc] = [r + d[0], c + d[1]];
if(nr >= 0 && nr < m && nc >= 0 && nc < n) {
if(grid[nr][nc] === 1) {
q.push([nr, nc]);
grid[nr][nc] = 2;
cntFresh--;
}
}
});
}
}
return cntFresh ? -1 : step;
};
'코딩테스트 (JS) > DFS | BFS' 카테고리의 다른 글
[JS] Permutations (0) | 2022.07.31 |
---|---|
[JS] Combinations (0) | 2022.07.31 |
[JS] 01 Matrix (0) | 2022.07.30 |
[JS] Populating Next Right Pointers in Each Node (0) | 2022.07.29 |
[JS] Merge Two Binary Trees (0) | 2022.07.29 |