๋ฐฑ์ค[JS] > 7569๋ฒ ํ ๋งํ
๋ฌธ์ ๋งํฌ
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);