[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

+ Recent posts