Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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
Archives
Today
Total
관리 메뉴

hwooo

BOJ (Java) 13913번: 숨바꼭질 4 본문

Study/Algorithm

BOJ (Java) 13913번: 숨바꼭질 4

hwooo 2025. 6. 26. 16:16

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

 

 


풀이

0~100,000까지 갈 수 있는 배열을 선언, 해당 배열에 현재 위치에 도달하게 된 경로를 저장한다.

수빈이의 위치(N)를 시작점으로 놓고 이동해가며 다음 위치를 확인한다. 이 때 이미 해당 위치에 도달한 기록이 있다면 제외한다. (중복 제거)

현재 위치가 K에 도달한다면 탐색을 중단하고, K부터 N까지 역으로 탐색하며 경로를 출력한다.


Java 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Queue;

public class Main {
    private static int N, K;
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String[] inputs = bf.readLine().split(" ");

        N = Integer.parseInt(inputs[0]);
        K = Integer.parseInt(inputs[1]);
        Queue<Integer> q = new ArrayDeque<>();

        int[] logs = new int[100_001];
        Arrays.fill(logs, -1);

        q.add(N);
        logs[N] = -2;
        
        // n + 1, n - 1, 2 * n으로 이동
        while (!q.isEmpty()) {
            Integer now = q.poll();
            if (now == K) break;
            if (now + 1 <= 100_000 && logs[now + 1] == -1) {
                logs[now + 1] = now;
                q.add(now + 1);
            }

            if (0 <= now - 1 && logs[now - 1] == -1) {
                logs[now - 1] = now;
                q.add(now - 1);
            }

            if (now * 2 <= 100_000 && logs[now * 2] == -1) {
                logs[now * 2] = now;
                q.add(now * 2);
            }
        }
        System.out.println(getCount(logs, K));
        printLog(logs, K);
    }

    // 이동 횟수 세기
    private static int getCount(int[] logs, int now) {
        if (logs[now] == -2) return 0;
        return getCount(logs, logs[now]) + 1;
    }

    // 이동한 기록 출력
    private static void printLog(int[] logs, int now) {
        if (now == -2) return;
        int bef = logs[now];
        printLog(logs, bef);
        System.out.print(now + " ");
    }
}

'Study > Algorithm' 카테고리의 다른 글

BOJ (Java) 1806번: 부분합  (0) 2025.06.24
BOJ (Java) 1946번: 신입 사원  (1) 2025.06.14
BOJ (Java) 2638번: 치즈  (0) 2025.06.10
BOJ (Java) 16940번: BFS 스페셜 저지  (0) 2025.06.04
BOJ (Java) 10942번: 팰린드롬?  (0) 2025.06.02