ALGORITHM

[JAVA] 백준 13913번- 숨바꼭질 4

연듀 2023. 1. 9. 21:10

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

 

13913번: 숨바꼭질 4

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

www.acmicpc.net

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int n, k;
    static int answer = 0;
    static boolean[] visited;
    static int[] arr;
    static int[] parent;
    static StringBuilder sb = new StringBuilder();

    static class Point {
        int v, cnt;

        public Point(int v, int cnt) {
            this.v = v;
            this.cnt = cnt;
        }
    }

    static boolean check(int x) {
        if (x < 0 || x > 100000 || visited[x]) return false;
        return true;
    }

    static void bfs(int v) {
        Queue<Point> queue = new LinkedList<>();
        queue.offer(new Point(v, 0));
        visited[v] = true;


        while (!queue.isEmpty()) {
            Point p = queue.poll();
            int x = p.v;
            int cnt = p.cnt;

            if (x == k) {
                answer = cnt;
                break;
            }

            if (check(x-1)) {
                queue.add(new Point(x - 1, cnt + 1));
                visited[x - 1] = true;
                parent[x-1] = x;
            }
            if (check(x+1)) {
                queue.add(new Point(x + 1, cnt + 1));
                visited[x + 1] = true;
                parent[x+1] = x;
            }
            if (check(x*2)) {
                queue.add(new Point(x * 2, cnt + 1));
                visited[x * 2] = true;
                parent[x*2] = x;
            }
        }


    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        n = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

        visited = new boolean[100001];
        parent = new int[100001];

        bfs(n);
        System.out.println(answer);

        Stack<Integer> stack = new Stack<>();
        int tmp = k;
        for(int i=0; i<=answer; i++){
            stack.push(tmp);
            tmp = parent[tmp];
        }
        while(!stack.isEmpty()){
            System.out.print(stack.pop()+" ");
        }
    }
}

 

기존 숨바꼭질 문제에서 방문한 좌표의 경로를 출력해야 하는 조건이 추가되었다.

부모 배열을 만들어 bfs 탐색할 때마다 탐색하는 노드의 부모 배열을 parent[index] = (index의 부모) 로 저장한 후,

목적지인 k부터 거슬러 올라가며 경로를 스택에 쌓은 후 출력한다. 

 

 

'ALGORITHM' 카테고리의 다른 글

[JAVA] 백준 13305번- 주유소  (0) 2023.01.13
[JAVA] 백준 13549번- 숨바꼭질 3  (0) 2023.01.09
[JAVA] 백준 1697번- 숨바꼭질  (0) 2023.01.09
[JAVA] 백준 1707번- 이분 그래프  (0) 2023.01.06
[JAVA] 백준 1987번- 알파벳  (0) 2023.01.06