반응형
▷ 문제 : 7569번 - 토마토
▷ 해결 날짜 : 2022.07.01
▷ 소요 시간 : 40분
▷ 풀이 과정 :
이 문제는 7576번 : 토마토 (골드Ⅴ) 문제의 응용문제이다.
그래서 그런지 난이도는 동일하다.
나 같은 경우에는 7576번: 토마토 문제를 이미 풀어봤기 때문에, 그 문제의 변형이라 해봤자 결국 위아래가 추가된 게 전부였다.
원래 4방향으로만 체크해주던걸 6방향으로 늘려주고, 고민 끝에 그냥 3중 배열로 방향을 잡고 문제를 풀어봤다.
그래서 높이값이 추가됐기 때문에 z라는 변수가 추가되어 수정된 부분 말고는 7576번: 토마토 문제와 풀이가 동일하다.
▷ 구현
let fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().split("\n");
// [x, y, z]
const ds = [
[-1, 0, 0],
[1, 0, 0],
[0, 1, 0],
[0, -1, 0],
[0, 0, 1],
[0, 0, -1],
];
const [M, N, H] = input.shift().split(" ").map(Number);
let queue = [];
let visit = [...Array(H)].map((h) =>
[...Array(N)].map((n) => Array(M).fill(0))
);
let count = M * N * H;
let z = 0;
let answer;
// 초기 상태 세팅
for (let i = 0; i < input.length; i++) {
let box = input[i].split(" ").map(Number);
box.forEach((tomato, pos) => {
if (tomato === 1) {
queue.push([i % N, pos, z, 0]);
visit[z][i % N][pos] = 1;
count--;
} else if (tomato === -1) {
visit[z][i % N][pos] = 1;
count--;
}
});
if ((i + 1) % N === 0) ++z;
}
let idx = 0;
while (queue.length != idx) {
const [x, y, z, pos] = queue[idx];
for (let i = 0; i < ds.length; i++) {
const xPos = x + ds[i][0];
const yPos = y + ds[i][1];
const zPos = z + ds[i][2];
if (xPos < 0 || yPos < 0 || zPos < 0 || xPos >= N || yPos >= M || zPos >= H)
continue;
if (!visit[zPos][xPos][yPos]) {
visit[zPos][xPos][yPos] = 1;
queue.push([xPos, yPos, zPos, pos + 1]);
count--;
}
}
idx++;
answer = pos;
}
console.log(count ? -1 : answer);
▷ 복기 :
코드 정리가 덜 된 것 같지만 그래도 뭐...
그림만 보고 어렵겠다 생각했는데, 이전에 풀어봤던 문제의 응용 버전이라 크게 어렵지는 않았다.
반응형
댓글