본문 바로가기
Algorithm/문제풀이

[백준] 7569번 : 토마토 (골드Ⅴ) by node.js

by 썸머워즈 2022. 7. 1.
반응형

▷ 문제 : 7569번 - 토마토

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

▷ 해결 날짜 : 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);

 

▷ 복기 :

코드 정리가 덜 된 것 같지만 그래도 뭐...

그림만 보고 어렵겠다 생각했는데, 이전에 풀어봤던 문제의 응용 버전이라 크게 어렵지는 않았다.

반응형


댓글

TOP