알고리즘/백준

[백준] 13549번 : 숨바꼭질 3

코딍코딍 2024. 1. 23. 20:59

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

 

13549번: 숨바꼭질 3

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

www.acmicpc.net

 

문제

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 0초 후에 2*X의 위치로 이동하게 된다.

 

입력

첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.

 

출력

수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.

 


소스코드

import java.util.*;
import java.io.*;

class Main {
    static int n, k;
    static int arr[];
    static boolean visited[];

    static class Node implements Comparable<Node> {
        int x;
        int value;

        public Node(int x, int value) {
            this.x = x;
            this.value = value;
        }

        @Override
        public int compareTo(Node o) {
            return this.value - o.value;
        }
    }
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

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

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

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

    static int bfs(int x) {
        PriorityQueue<Node> pq = new PriorityQueue<>();
        pq.add(new Node(x, 0));

        if(x == k) return 0;
        while(!pq.isEmpty()) {
            Node node = pq.poll();
            int curX = node.x;
            visited[curX] = true;
            if(curX == k) return node.value;

            if(curX * 2 < 100001 && !visited[curX * 2]) pq.add(new Node(curX * 2, node.value));
            if(curX + 1 < 100001 && !visited[curX + 1]) pq.add(new Node(curX + 1, node.value + 1));
            if(curX - 1 >= 0 && !visited[curX - 1]) pq.add(new Node(curX - 1, node.value + 1));
        }

        return -1;
    }
}

 

 

해결 방법

  1. BFS를 사용하였고 가중치가 있는 경로이기에 우선순위 큐에 이동 가능한 정점을 넣었다.
  2. 가중치가 짧은 정점이 우선순위가 되도록 기준을 잡아 가장 먼저 도착하는 정점이 최단 거리가 된다.
  3. 순서에 따른 의존도가 생기지 않도록 우선순위 큐에서 정점을 꺼냈을 때 방문 처리를 했다.