728x90
https://www.acmicpc.net/problem/13913
// 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
import java.util.*;
import java.io.*;
public class Main {
static int N, K;
// 정답
static StringBuilder sb = new StringBuilder();
// dist : 수빈이가 동생을 찾는 가장 빠른시간
// move : 어떻게 이동해야 하는지에대한 히스토리
static int[] dist = new int[100001], move = new int[100001];
// 탐색을 하며 찾는다.
static void bfs() {
Deque<Integer> deq = new ArrayDeque<>();
deq.offer(N);
dist[N] = 1;
int next = 0;
while(!deq.isEmpty()) {
int now = deq.poll();
// 동생을 잡음
if(now == K) {
// 최단거리
sb.append( (dist[now]-1) + "\n");
// 이동 경로를 추적한다.
Stack<Integer> myStack = new Stack<>();
myStack.push(now);
while( now != N ) {
myStack.push(move[now]);
now = move[now];
}
while( !myStack.isEmpty() ) {
sb.append(myStack.pop() + " ");
}
sb.append("\n");
return;
}
// 3개의 탐색방향
for(int i=0; i<3; ++i) {
// 각각 3개 방향을 설정해준다.
if(i == 0) next = now + 1;
else if(i == 1) next = now - 1;
else next = now * 2;
// 필터링..
if( next < 0 || next > 100000 || dist[next] != 0 ) continue;
// 필터링을 통과하였을 경우
deq.offer(next);
dist[next] = dist[now] + 1;
move[next] = now;
}
}
}
// main
public static void main(String[] args) throws Exception{
// Please Enter Your Code Here
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
bfs();
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
|
cs |
반응형
'CS > 알고리즘_문제풀이(자바)' 카테고리의 다른 글
이동하기 (0) | 2021.11.03 |
---|---|
DSLR (0) | 2021.11.02 |
카잉달력 (0) | 2021.11.01 |
리모컨 (0) | 2021.11.01 |
합분해 😰 어려움.. (0) | 2021.10.21 |