๐Ÿ”’Algorithm

๋ฐฑ์ค€[JS] > 7569๋ฒˆ ํ† ๋งˆํ† 

devWarrior 2025. 1. 28. 23:13

๋ฌธ์ œ๋งํฌ

https://www.acmicpc.net/problem/7569

๋ฌธ์ œํ’€์ด

์ด ๋ฌธ์ œ๋Š” 3์ฐจ์› ๋ฐฐ์—ด(storage)์„ ๋งŒ๋“ค๊ณ  BFS๋กœ ๊ทธ 3์ฐจ์› ๋ฐฐ์—ด์˜ ํ† ๋งˆํ† ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ตํžˆ๋ฉด ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ f๋Š” floor, r๋Š” row, c๋Š” column์˜ ์•ฝ์ž์ด๋‹ค. ์ฒ˜์Œ์—๋Š” ๊ฐ ์œ„์น˜์— ์žˆ๋Š” ํ† ๋งˆํ† ๊ฐ€ ์ต๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” 3์ฐจ์›๋ฐฐ์—ด์„ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋Š”๋ฐ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ 3์ฐจ์› ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์„ ๊ฐ€์ง€๊ณ  ๋ฌธ์ œ๋ฅผ ์ ‘๊ทผํ•˜์˜€๋Š”๋ฐ ๋˜ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ์—ˆ๋‹ค. ๊ณ ์‹ฌ๋์— while๋ฌธ ๋‚ด๋ถ€ if๋ฌธ์˜ ์กฐ๊ฑด์„ storage[nextF] && storage[nextF][nextR] && storage[nextF][nextR][nextC] ํ˜•ํƒœ๋กœ 3์ฐจ์›๋ฐฐ์—ด์˜ ์กด์žฌ์—ฌ๋ถ€๋ฅผ key๊ฐ’๋“ค์„ ์ด์šฉํ•ด ํ™•์ธํ•˜๋Š” ํ˜•ํƒœ์—์„œ 43~48 ๋ฒˆ์งธ ์ค„ ์ฒ˜๋Ÿผ ๋‹จ์ˆœํžˆ ์ˆซ์ž๋ฅผ ๋น„๊ตํ•˜๋Š” ํ˜•ํƒœ๋กœ ์กฐ๊ฑด๋ฌธ์„ ๋ณ€๊ฒฝํ•˜๋‹ˆ ์‹œ๊ฐ„์ดˆ๊ณผ ์—†์ด ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

let fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

let [M, N, H] = input
    .shift()
    .split(" ")
    .map((n) => Number(n));

let storage = Array.from({ length: H }, () => {
    return Array.from({ length: N }, () => {
        return 0;
    });
});

for (let f = 0; f < H; ++f) {
    for (let r = 0; r < N; ++r) {
        let line = input[f * N + r].split(" ").map((n) => Number(n));

        storage[f][r] = line;
    }
}

for (let f = 0; f < H; ++f) {
    for (let r = 0; r < N; ++r) {
        for (let c = 0; c < M; ++c) {
            let v = storage[f][r][c];

            if (v === 1) {
                let q = [[f, r, c]];

                while (q.length) {
                    let [nowF, nowR, nowC] = q.shift();

                    // ์œ—๋ฐ•์Šค,์•„๋žซ๋ฐ•์Šค์Šค, ์ƒ,ํ•˜,์ขŒ,์šฐ
                    let df = [1, -1, 0, 0, 0, 0],
                        dr = [0, 0, 1, -1, 0, 0],
                        dc = [0, 0, 0, 0, -1, 1];

                    for (let step = 0; step < 6; ++step) {
                        let [nextF, nextR, nextC] = [nowF + df[step], nowR + dr[step], nowC + dc[step]];

                        if (
                            nextF >= 0 &&
                            nextF < H &&
                            nextR >= 0 &&
                            nextR < N &&
                            nextC >= 0 &&
                            nextC < M &&
                            storage[nextF][nextR][nextC] !== -1 &&
                            (storage[nextF][nextR][nextC] === 0 || storage[nextF][nextR][nextC] > storage[nowF][nowR][nowC] + 1)
                        ) {
                            storage[nextF][nextR][nextC] = storage[nowF][nowR][nowC] + 1;
                            q.push([nextF, nextR, nextC]);
                        }
                    }
                }
            }
        }
    }
}

let answer = 0;
for (let f = 0; f < H; ++f) {
    for (let r = 0; r < N; ++r) {
        for (let c = 0; c < M; ++c) {
            if (storage[f][r][c] === 0) {
                answer = -1;
                console.log(answer);
                return;
            } else if (storage[f][r][c] >= 1) {
                answer = Math.max(answer, storage[f][r][c] - 1);
            }
        }
    }
}

console.log(answer);