Skip to content

Commit 679b092

Browse files
committed
[Gold IV] Title: 숨바꼭질 4, Time: 176 ms, Memory: 24460 KB -BaekjoonHub
1 parent d0e1940 commit 679b092

File tree

2 files changed

+97
-0
lines changed

2 files changed

+97
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# [Gold IV] 숨바꼭질 4 - 13913
2+
3+
[문제 링크](https://www.acmicpc.net/problem/13913)
4+
5+
### 성능 요약
6+
7+
메모리: 24460 KB, 시간: 176 ms
8+
9+
### 분류
10+
11+
그래프 이론, 그래프 탐색, 너비 우선 탐색, 역추적
12+
13+
### 제출 일자
14+
15+
2025년 8월 16일 10:40:12
16+
17+
### 문제 설명
18+
19+
<p>수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.</p>
20+
21+
<p>수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.</p>
22+
23+
### 입력
24+
25+
<p>첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.</p>
26+
27+
### 출력
28+
29+
<p>첫째 줄에 수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.</p>
30+
31+
<p>둘째 줄에 어떻게 이동해야 하는지 공백으로 구분해 출력한다.</p>
32+
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
static final int MAX = 100_000;
6+
7+
public static void main(String[] args) throws Exception {
8+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
StringTokenizer st = new StringTokenizer(br.readLine());
10+
11+
int start = Integer.parseInt(st.nextToken());
12+
int target = Integer.parseInt(st.nextToken());
13+
14+
if (start == target) {
15+
System.out.println(0);
16+
System.out.println(start);
17+
return;
18+
}
19+
20+
int[] dist = new int[MAX + 1];
21+
int[] prev = new int[MAX + 1];
22+
Arrays.fill(dist, Integer.MAX_VALUE);
23+
Arrays.fill(prev, Integer.MAX_VALUE);
24+
25+
ArrayDeque<Integer> q = new ArrayDeque<>();
26+
q.add(start);
27+
dist[start] = 0;
28+
prev[start] = -1; // 시작이 끝지점
29+
30+
while (!q.isEmpty()) {
31+
int cur = q.poll();
32+
int[] nexts = {cur - 1, cur + 1, cur * 2};
33+
for (int nx : nexts) {
34+
if (nx < 0 || nx > MAX) continue;
35+
36+
if (dist[cur] + 1 < dist[nx]) {
37+
dist[nx] = dist[cur] + 1;
38+
prev[nx] = cur;
39+
q.add(nx);
40+
41+
if (nx == target) {
42+
q.clear();
43+
break;
44+
}
45+
}
46+
}
47+
}
48+
49+
int len = dist[target] + 1;
50+
int[] path = new int[len];
51+
int v = target;
52+
for (int i = len - 1; i >= 0; i--) {
53+
path[i] = v;
54+
v = prev[v];
55+
}
56+
57+
StringBuilder sb = new StringBuilder();
58+
sb.append(dist[target]).append('\n');
59+
for (int i = 0; i < len; i++) {
60+
if (i > 0) sb.append(' ');
61+
sb.append(path[i]);
62+
}
63+
System.out.println(sb);
64+
}
65+
}

0 commit comments

Comments
 (0)