본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 13913번 숨바꼭질 4

by 현장 2026. 1. 24.

-Code

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

public class BOJ13913 {
    static class Info {
        int pos, time;

        public Info(int pos, int time) {
            this.pos = pos;
            this.time = time;
        }
    }
    static Integer[] parents = new Integer[100001];
    static {
        Arrays.fill(parents, null);
    }

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

        int subinPos = Integer.parseInt(st.nextToken());
        int sisterPos = Integer.parseInt(st.nextToken());
        // 탐색 로직
        Info answer = getInfo(new Info(subinPos, 0), sisterPos);
        // 출력
        StringBuilder sb = new StringBuilder();
        sb.append(answer.time).append("\n");
        // 역추적
        ArrayList<Integer> posList = new ArrayList<>();
        int pos = sisterPos;
        while (pos != -1) {
            posList.add(pos);
            pos = parents[pos];
        }
        // 역추적
        Collections.reverse(posList); // 11 버전이므로 변경
        for (int p : posList) {
            sb.append(p).append(" ");
        }
        System.out.println(sb);
        
    }

    private static Info getInfo(Info subin, int target) {
        // visited 셋팅
        parents[subin.pos] = -1;
        // 덱 셋팅
        Deque<Info> infoDeq = new ArrayDeque<>();
        infoDeq.addLast(subin);
        // 탐색
        while (!infoDeq.isEmpty()) {
            Info now = infoDeq.pollFirst();

            if (now.pos == target) {
                return now;
            }
            // 이동 위치 배열
            int[] movePos = {now.pos - 1, now.pos + 1, now.pos * 2};
            for (int next : movePos) {
                // 움직일 수 있고 방문하지 않은 경우
                if (isMove(next) && parents[next] == null) {
                    // 해당 위치에 부모 위치를 넣어서 추적 가능하도록함
                    parents[next] = now.pos;
                    infoDeq.addLast(new Info(next, now.time + 1));
                }
            }
        }
        return null;
    }

    private static boolean isMove(int next) {
        return (next >= 0 && next < 100001);
    }
}

처음에 ArrayList를 class에 넣어서 이동한 곳을 추적하려 했으나 메모리 초과 발생할 수 있다는 것을 알게 되었습니다. 그래서 힌트로 얻은 게 배열 하나에 현재 위치를 인덱스로 하고 그 위치에 이전 위치를 담아서 도착점부터 역방향으로 돌면서 추적은 것이었습니다. 해당 방법을 Integer로 null이 가능하게 받아서 시작점을 -1로 하고 방문하지 않은 곳을 null로 하여 검사해 해결했습니다.

'Beakjoon&프로그래머스 > Java' 카테고리의 다른 글

[백준/Java] 2573번 빙산  (0) 2026.01.24
[백준/Java] 7798번 Hotel  (0) 2026.01.24
[백준/Java] 6593번 상범 빌딩  (0) 2026.01.24
[백준/Java] 4179번 불!  (0) 2026.01.23
[백준/Java] 14503번 로봇 청소기  (0) 2026.01.23