CS/알고리즘_문제풀이(자바)

숨바꼭질 4

Jedy_Kim 2021. 11. 2. 16:55
728x90

https://www.acmicpc.net/problem/13913

 

13913번: 숨바꼭질 4

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

www.acmicpc.net

 

// 코드

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