[백준 7569번] BFS(너비 우선 탐색) - 토마토

김민지·2023년 8월 2일
0

냅다 시작 백준

목록 보기
71/118

✨ 문제 ✨


✨ 정답 ✨

// const { count } = require("console");
const fs = require("fs");
const { nextTick } = require("process");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./예제.txt";
let input = fs.readFileSync(filePath).toString().trim();


// const fs = require('fs'); 
// let input = fs.readFileSync("/dev/stdin").toString().trim();


input=input.split('\n')

// [x, y, z]
const directions = [
  [-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);

// 1인 지점을 먼저 queue에 모두 넣어 주어야 하기 때문에
// queue를 밖에서 만들어 주어야 한다.
let queue = [];
let visited = [...Array(H)].map((h) =>
  [...Array(N)].map((n) => Array(M).fill(0))
);
let count = M * N * H;
let z = 0;
let answer;

// 1인 부분을 미리 queue에 넣어준다.
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]);
      visited[z][i % N][pos] = 1;
      count--;
    } else if (tomato === -1) {
      visited[z][i % N][pos] = 1;
      count--;
    }
  });
  if ((i + 1) % N === 0) ++z;
}



let index = 0;
while (queue.length != index) {
  const [x, y, z, pos] = queue[index];
  for (let i = 0; i < directions.length; i++) {
    const xPos = x + directions[i][0];
    const yPos = y + directions[i][1];
    const zPos = z + directions[i][2];

    if (xPos < 0 || yPos < 0 || zPos < 0 || xPos >= N || yPos >= M || zPos >= H)
      continue;
    if (!visited[zPos][xPos][yPos]) {
      visited[zPos][xPos][yPos] = 1;
      queue.push([xPos, yPos, zPos, pos + 1]);
      count--;
    }
  }

  index++;
  answer = pos;
}

console.log(count ? -1 : answer);

🧵 참고한 정답지 🧵

https://mine-it-record.tistory.com/612

💡💡 기억해야 할 점 💡💡

1인 부분을 미리 queue에 넣어주기 위해 queue를 밖에서 선언을 해 주었다.

profile
이건 대체 어떻게 만든 거지?

0개의 댓글