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

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

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

▷ 문제 : 7576번 - 토마토

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

▷ 해결 날짜 : 2022.04.07
▷ 소요 시간 : 1시간 30분
▷ 풀이 과정 :

처음으로 풀어보는 골드 난이도다.

문제를 보면 상자의 크기가 주어지고 토마토의 위치가 주어지는데 1의 위치부터 상하좌우 번져가면서 토마토를 익혀 총 몇일이 걸리는지 확인하는 문제이다.

 

결국 다른 문제와 마찬가지로 1부터 시작해서 전체를 쭉 탐색하면 되는것인데, 시간 초과에서 걸려버렸다.

그래서 일단 시간초과에 걸릴만한 녀석들과 로직을 정리를 해주었다.

 

처음에는 로직을 한번돌때마다 카운팅을 해주는 방식으로 진행했는데, 그 반대로 초기값에서 빼주는 형식으로 로직을 변경하였고 (count-- 부분), queue에 넣어둘때 어차피 하루씩 걸리니까 날짜 정보를 같이 넣어주었다.(pos)

 

이렇게 바꿈으로써 array 함수를 하나 뺄 수 있게 되었지만 역시 시간 초과가 나는데, 그 이유는 shift() 때문이다.

원래 queue에서 하나씩 빼서 사용하곤 했는데, 이 녀석 때문에 시간초과가 걸려 그냥 안 빼고 인덱스 변수를 사용하는 방향으로 잡고 진행하였다.

 

▷ 구현

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

const ds = [[-1, 0], [1, 0], [0, 1], [0, -1]];
const [M, N] = input[0].split(' ').map(Number);
let queue = [];
let visit = [...Array(N)].map(e => Array(M).fill(0));
let count = M * N;
let answer;

// 초기 상태 세팅
for(let i = 1; i < input.length; i++){
  let box = input[i].split(' ').map(Number);

  box.forEach((tomato, pos) => {
    if(tomato === 1) {
      queue.push([i - 1, pos, 0]);
      visit[i - 1][pos] = 1;
      count--;
    }else if(tomato === -1){
      visit[i - 1][pos] = 1;
      count--;
    }
  });
}

let idx = 0;
while(queue.length != idx){
  const [x, y, pos] = queue[idx];
  for(let i = 0 ; i < 4 ; i++){
    const xPos = x + ds[i][0];
    const yPos = y + ds[i][1];

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

  idx++
  answer = pos;
}

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

 

▷ 복기 :

시간 초과에서 굉장히 헤맸다.

nodeJs 질문 글도 많이 없고, 그래도 shift() 때문이라는 것을 확인하고 나서는 금방 해결되었다.

 

일단 비슷한 형식의 문제들이 많아서 그나마 풀 수 있는 거 같은데, 실버 골드 문제를 위주로 많이 풀어봐야 할 것 같다.

반응형


댓글

TOP