Algorithm
[백준] 1697번: 숨바꼭질 - Node.js (자바스크립트)
sqsung
2023. 5. 22. 10:38
1. 문제
1697번: 숨바꼭질
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
2. 풀이
const [subin, sister] = require('fs').readFileSync('/dev/stdin').toString().trim().split(' ').map(val => +val);
const visited = Array.from({ length: 100100 }, () => false);
const bfsMoveSubin = N => {
const queue = [[N, 0]];
visited[N] = true;
while (queue.length) {
const [subinCurrent, time] = queue.shift();
if (subinCurrent === sister) return time;
[subinCurrent - 1, subinCurrent + 1, subinCurrent * 2].forEach(possibility => {
if (!visited[possibility] && possibility >= 0 && possibility <= 100000) {
visited[possibility] = true;
queue.push([possibility, time + 1]);
}
});
}
};
console.log(bfsMoveSubin(subin));
2-1. 풀이 설명
수빈이는 1초 마다 N + 1, N - 1, or N * 2 칸으로 이동할 수 있다. 문제의 핵심은 현재 수빈의 위치에서 동생의 위치까지 가기 위해서 어떤 조합으로 가야 가장 효율적인지 찾는 것이다.
BFS 탐색으로 현재 수빈의 위치를 기준으로, 각 N + 1, N - 1, or N * 2 칸을 탐색하고 동생의 위치와 일치한지 확인한다. 맞는 경우 현재까지 누적된 시간 값을 반환하고, 아니라면 다시 현재 값을 기준으로 N + 1, N - 1, or N * 2 칸을 탐색한다.