본문 바로가기

PS/백준

[백준 #12851] 숨바꼭질2 - JAVA(자바)

문제

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

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

수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 그리고, 가장 빠른 시간으로 찾는 방법이 몇 가지 인지 구하는 프로그램을 작성하시오.

코드

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

public class Main {


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] split = br.readLine().split(" ");
        int n = Integer.parseInt(split[0]);
        int k = Integer.parseInt(split[1]);
        int[] arr = new int[100_001]; // arr[x]: n -> x로 이동하는 가장 빠른 시간
        Arrays.fill(arr, -1);
        arr[n] = 0;
        int cnt = -1;
        Queue<Integer> q = new LinkedList<>();
        q.add(n);
        while(!q.isEmpty()){
            int cur = q.poll();
            int[] tmp = new int[]{cur - 1, cur + 1, cur * 2};
            for (int i = 0; i < 3; i++) {
                int nxt = tmp[i];
                if(nxt > 100_000 || nxt < 0) continue;
                if(arr[nxt] != -1 && arr[nxt] < arr[cur] + 1) continue; // arr[nxt] < arr[cur] + 1. 가장 빠른 시간을 찾고 난 후에 이후 가능한 시간은 가장 빠른 시간과 동일하거나 더 많은 시간이 걸리는 경우이다.
                arr[nxt] = arr[cur] + 1;
                q.add(nxt);
                if(nxt == k) cnt++;
            }
        }

        System.out.println(arr[k]);
        System.out.println(cnt == -1 ? 1 : cnt + 1); // cnt == -1 인 경우는 n == k 인 경우이다.
    }
}