Skip to content

Commit ff36091

Browse files
committed
[Gold V] Title: 숨바꼭질 3, Time: 168 ms, Memory: 16380 KB -BaekjoonHub
1 parent 7657c8f commit ff36091

2 files changed

Lines changed: 102 additions & 0 deletions

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# [Gold V] 숨바꼭질 3 - 13549
2+
3+
[문제 링크](https://www.acmicpc.net/problem/13549)
4+
5+
### 성능 요약
6+
7+
메모리: 16380 KB, 시간: 168 ms
8+
9+
### 분류
10+
11+
그래프 이론, 그래프 탐색, 너비 우선 탐색, 최단 경로, 데이크스트라, 0-1 너비 우선 탐색
12+
13+
### 제출 일자
14+
15+
2026년 3월 5일 08:30:42
16+
17+
### 문제 설명
18+
19+
<p>수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 0초 후에 2*X의 위치로 이동하게 된다.</p>
20+
21+
<p>수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.</p>
22+
23+
### 입력
24+
25+
<p>첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.</p>
26+
27+
### 출력
28+
29+
<p>수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.</p>
30+
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
let input = require('fs').readFileSync('./dev/stdin').toString().trim().split('\n');
2+
let [N, K] = input[0].split(' ').map(Number);
3+
let dist = Array(100001).fill(-1);
4+
5+
let q = [];
6+
let head = 0;
7+
8+
let multiQ = [];
9+
let multiHead = 0;
10+
11+
const dx = [-1, 1];
12+
13+
multiQ.push(N);
14+
15+
dist[N] = 0;
16+
17+
while (1) {
18+
// 다중 스타트
19+
20+
while (multiQ.length > multiHead) {
21+
let A = multiQ[multiHead++];
22+
23+
for (let i = A; i < 100001; i *= 2) {
24+
// 이미 방문
25+
if (dist[i] === -1) {
26+
q.push(i);
27+
dist[i] = dist[A];
28+
// 시작점은 이미 방문 처리는 되어 있지만 q에 넣어야 걷기 탐색 가능
29+
} else if (i === A) {
30+
q.push(i);
31+
} else {
32+
break;
33+
}
34+
if (i === 0) {
35+
break;
36+
}
37+
}
38+
}
39+
40+
while (q.length > head) {
41+
let x = q[head++];
42+
43+
// 만나면
44+
if (x === K) {
45+
return console.log(dist[x]);
46+
}
47+
48+
for (let i = 0; i < 2; i++) {
49+
let nx = x + dx[i];
50+
51+
// 유효하지 않은 범위
52+
if (nx < 0 || nx > 100000) {
53+
continue;
54+
}
55+
// 이미 방문
56+
if (dist[nx] !== -1) {
57+
continue;
58+
}
59+
60+
dist[nx] = dist[x] + 1;
61+
62+
multiQ.push(nx);
63+
}
64+
}
65+
}
66+
67+
// 발산
68+
// 전형적인 BFS 1차원 배열 문제
69+
// 1차원 dist 배열 만들어서 수빈이 현재 위치로부터 퍼뜨리기
70+
// 0초 후에 2*X 위치라는건 다출발 BFS 라는 것
71+
// 다출발 BFS 각각에서 +- 1 하고 동생 위치에 닿으면 해당 dist return
72+
// 순간이동 전부 -> +- 1 -> 순간이동

0 commit comments

Comments
 (0)