본문 바로가기
코딩테스트(알고리즘)/baekjoon

[baekjoon] 12851 숨바꼭질2 (Javascript)

by Cafe Mocha 2023. 2. 3.

12851번: 숨바꼭질 2 (acmicpc.net)

 

12851번: 숨바꼭질 2

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때

www.acmicpc.net


알고리즘 : bfs

 

bfs는 2차원에 익숙해서 그외의 경우가 더어렵다고 느껴진다.

이번 문제는 max값을 설정하지 않아서 고생했다.

로직은 맞는데 자꾸 틀려서 max값을 문제의 최대값 *2로 변경했더니 풀린다!

예외처리에 집중하자!!

 

function solution() {
  let input = require("fs")
    .readFileSync("input.txt") //"/dev/stdin"
    .toString()
    .split("\n")
    .map((val) => val.trim());

  let [n, k] = input
    .shift()
    .split(" ")
    .map((v) => +v);

  let max = 200000;

  // 1초후 x-1 or x+1
  // 1초후 2*x

  let ans = new Array(max + 4).fill(0);
  let vis = new Array(max + 4).fill(0);

  // 모든 경우의 수를 확인? ->2초 가능할듯

  const check = (start, end) => {
    let queue = [];
    vis[start] = 1;
    ans[start] = 1;
    queue.push(start);
    while (queue.length) {
      let cx = queue.shift();
      for (let dir = 0; dir < 3; dir++) {
        let nx;
        if (dir === 0) nx = cx * 2;
        else if (dir === 1) nx = cx + 1;
        else nx = cx - 1;

        if (nx >= 0 && nx < max) {
          if (!vis[nx]) {
            queue.push(nx);
            vis[nx] = vis[cx] + 1;
            ans[nx] += ans[cx];
          } else if (vis[nx] === vis[cx] + 1) {
            ans[nx] += ans[cx];
          }
        }
      }
    }
  };

  check(n, k);

  console.log(vis[k] - 1);
  console.log(ans[k]);
}

solution();