[boj] 1697. 숨바꼭질 (node.js)

호이·2022년 2월 24일
0

algorithm

목록 보기
29/77
post-thumbnail

문제 요약

[boj] 1697. 숨바꼭질 (node.js)

  • 주어진 두 지점 간 이동방법이 3가지로 정해져 있을 때, 시작점부터 도착점에 도달 가능한 최단 시간은?

풀이

  • 1초에 const getCand = (node) => [node - 1, node + 1, node * 2]; 이 세 가지의 후보 중 하나로 이동 가능하다. 따라서 이를 함수로 만들어 활용했고, BFS로 time[] 배열에 값을 갱신하여 queue에 입력하는 노드가 도착 노드인 경우 바로 return 해 주었다.
  • 점의 위치가 0 ≤ N ≤ 100,000 으로 고정되어 있음을 유의하고 불필요한 지점을 +-무한대로 탐색하는 일을 방지해 주어야 한다.

내 풀이

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let cnt = 0;
const input = () => stdin[cnt++].split(" ").map(Number);
const getCand = (node) => [node - 1, node + 1, node * 2];

let stdin = [];
rl.on("line", function (line) {
  stdin.push(line);
}).on("close", function () {
  let [node, fin] = input();
  let queue = [node];
  console.log(bfs());
  process.exit();

  function bfs() {
    if (node == fin) return 0;
    let time = [];
    let visited = [];
    time[node] = 0;
    visited[node] = 1;
    while (queue.length) {
      node = queue.shift();
      const cand = getCand(node);
      for (let i = 0; i < 3; i++) {
        const elem = cand[i];
        if (visited[elem] || elem < 0 || elem > 100000) continue;
        visited[elem] = 1;
        time[elem] = time[node] + 1;
        if (elem == fin) return time[fin];
        queue.push(elem);
      }
    }
  }
});

주절주절

  • 처음에 최대숫자의 자릿수를 잘못 보고 조건에 0을 하나 더 붙이고 풀어, 불필요한 탐색이 일어나 시간초과가 계속 발생했다. 숫자 제대로 확인하자!
profile
매일 부활하는 개복치

0개의 댓글