๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿƒ algorithm/leetcode

LeetCode 994 - Rotting Oranges (Medium)

by HandHand 2023. 4. 24.

 

๐Ÿ’ก ๋ฌธ์ œ

LeetCode - 994๋ฒˆ

 

๐ŸŽฏ ํ’€์ด ๊ณผ์ •

๋งค ๋‹จ์œ„์‹œ๊ฐ„(minute) ๋งˆ๋‹ค ์ฉ์€ ์˜ค๋ Œ์ง€์— ์ธ์ ‘ํ•œ 4๋ฐฉํ–ฅ์— ์œ„์น˜ํ•œ ์˜ค๋ Œ์ง€๊ฐ€ ํ•จ๊ป˜ ์ฉ๋Š”๋‹ค๊ณ  ํ• ๋•Œ

์ฃผ์–ด์ง„ grid ์—์„œ ๋ชจ๋“  ์˜ค๋ Œ์ง€๊ฐ€ ์ฉ๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

์ผ๋ฐ˜์ ์ธ BFS ํƒ์ƒ‰์—์„œ ์•ฝ๊ฐ„์˜ ๋ณ€ํ˜•์ด ํ•„์š”ํ•œ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

์ฉ์€ ์˜ค๋ Œ์ง€๋ฅผ queue ์— ๋„ฃ์–ด์ฃผ๊ณ  queue ๊ฐ€ ๋น„์–ด์งˆ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด์•ผ์ง€

๊ฐ๊ฐ์˜ ๋‹จ์œ„ ์‹œ๊ฐ„๋งˆ๋‹ค ํ˜„์žฌ queue ์— ๋‹ด๊ฒจ์žˆ๋Š” ์˜ค๋ Œ์ง€๋“ค์— ๋Œ€ํ•ด BFS ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ณดํ†ต BFS ๋ฅผ ํ•  ๋•Œ ์ค‘๋ณต ๋ฐฉ๋ฌธ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด visit ๊ฐ™์€ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด ์ด์šฉํ•˜๋Š”๋ฐ,

์—ฌ๊ธฐ์„œ๋Š” ์˜ค๋ Œ์ง€๊ฐ€ ์ฉ์€ ์ƒํƒœ์ผ ๋•Œ๋ฅผ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์œ„์น˜๋กœ ํŒ๋‹จ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ

๋ฐฉ๋ฌธ์—ฌ๋ถ€๋ฅผ ์œ„ํ•œ ๋ณ„๋„์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋งŒ๋“ค์–ด์ฃผ์ง€ ์•Š๊ณ  ์ƒํƒœ๊ฐ’์œผ๋กœ ํŒ๋‹จํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ‘จโ€๐Ÿ’ป ์ฝ”๋“œ

/**
 * @param {number[][]} grid
 * @return {number}
 */
var orangesRotting = function(grid) {
    const [ROW, COL] = [grid.length, grid[0].length]
    const dr = [1, -1, 0, 0]
    const dc = [0, 0, 1, -1]
    const queue = []

    function preparation() {
        for (let row = 0; row < ROW; row += 1) {
            for (let col = 0; col < COL; col += 1) {
                const isRotten = grid[row][col] === 2
                if (isRotten) {
                    queue.push([row, col])
                }
            }
        }
    }

    function outOfRange(row, col) {
        return row < 0 || row >= ROW || col < 0 || col >= COL
    }

    function rottening() {
        let minute = -1

        while (queue.length > 0) {
            let iterate = queue.length

            while (iterate > 0) {
                const [hr, hc] = queue.shift()

                for (let dir = 0; dir < 4; dir += 1) {
                    const [nr, nc] = [dr[dir] + hr, dc[dir] + hc]
                    if (outOfRange(nr, nc)) {
                        continue
                    }

                    const isEmpty = grid[nr][nc] === 0
                    const isRotten = grid[nr][nc] === 2

                    if (isEmpty || isRotten) {
                        continue
                    }

                    grid[nr][nc] = 2 // now, adjacent orange is rottening
                    queue.push([nr, nc])
                }

                iterate -= 1
            }

            minute += 1
        }

        return minute
    }  

    preparation()
    const minute = rottening()

    for (let row = 0; row < ROW; row += 1) {
        for (let col = 0; col < COL; col += 1) {
            const isFresh = grid[row][col] === 1
            if (isFresh) {
                return -1
            }
        }
    }

    return Math.max(minute, 0)
};
๋ฐ˜์‘ํ˜•

'๐Ÿƒ algorithm > leetcode' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

LeetCode 15 - 3Sum (Medium)  (0) 2023.04.24
LeetCode 13 - Roman to Integer (Easy)  (0) 2023.04.24
LeetCode 24 - Swap Nodes in Pairs (Medium)  (0) 2023.02.20
LeetCode 35 - Search Insert Position (Easy)  (0) 2023.02.20
LeetCode 169 - Majority Element (Easy)  (2) 2023.02.05