개발자 톡

연습문제 톡 동계 테스트 시점 예측

JS

등록일
2024-11-18 18:05:06
조회수
49
작성자
vavoya6324

'


const fs = require('fs');
const input = fs.readFileSync('input.txt', 'utf8').trim().split(/\n+/);
const [N, M] = input[0].split(/\s+/).map(Number);




const box = Array.from({length: N + 2}, () => Array.from({length: M + 2}, () => 0));
input.slice(1).forEach((line, i1) => {
    line.split(/\s+/).forEach((v2, i2) => {
        box[i1 + 1][i2 + 1] = Number(v2);
    })
})
const visitedBox = Array.from({length: N + 2}, () => Array.from({length: M + 2}, () => 0));


let time = 0
function bfs() {
    time++
    const count1Set = new Set()
    const count2Set = new Set()
    const bfsQue = new Set([[0, 0]])
    visitedBox[0][0] = time;


    function test(x, y) {
        const string =`${x},${y}`
        if (box[x] !== undefined) {
            if (box[x][y] === 1) {
                if (count1Set.has(string)) {
                    count1Set.delete(string)
                    count2Set.add(string)
                }
                else if (!count2Set.has(string)) {
                    count1Set.add(string)
                }
            }
            // 얼음이 아닌 곳이, 현재 시각 기준으로 방문한 곳이 아니면
            else if (box[x][y] === 0 && visitedBox[x][y] !== time) {
                bfsQue.add([x, y])
                visitedBox[x][y] = time;
            }
        }
    }






    // 순회
    for (let position of bfsQue) {
        const [x, y] = position
        // 읽었으니 지우기
        bfsQue.delete(position)


        // 다음 위치
        test(x, y + 1)
        test(x, y - 1)
        test(x + 1, y)
        test(x - 1, y)


    }


    // 지울게 없으면
    if (count2Set.size === 0) {
        return false
    }


    for (let i of count2Set) {
        const [x, y] = i.split(',')
        box[x][y] = 0
    }
    return true
}


while (bfs()) {}


console.log(time - 1)
#동계_테스트_시점_예측
#js

이 카테고리의 톡 더보기