[백준 #1697] 숨바꼭질

Yujjin·2025년 1월 25일

백준

목록 보기
6/20
post-thumbnail

백준 #1697 숨바꼭질

백준 #1697


문제 설명👩‍🏫

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

입출력 예

입력
5 17

출력
4


내 코드💻

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

public class Main {
    static ArrayList<Integer>[] list;
    static int start, end,length;
    static int[] visited;
    static int[] hide;
    static Queue<Integer> queue = new LinkedList<>();

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        StringTokenizer st = new StringTokenizer(str," ");
        start = Integer.parseInt(st.nextToken());
        end = Integer.parseInt(st.nextToken());

        if(start <= end) {
            length = end + 2;

            visited = new int[length];
            hide = new int[length];

            list = new ArrayList[length];
            for (int i = 0; i < length; i++) {
                list[i] = new ArrayList<>();

                int n = i;
                list[i].add(n - 1);
                list[i].add(n + 1);
                list[i].add(n * 2);
            }

            queue.offer(start);

            bfs();
            System.out.println(hide[length - 2]);
        }
        else{
            System.out.println(start-end);
        }
    }

    static void bfs(){
        while(!queue.isEmpty()){
            int num = queue.poll();
            visited[num]=1;

            for(int j=0;j<list[num].size();j++) {
                int tmp = list[num].get(j);
                if(checking(tmp) && visited[tmp]==0 &&hide[tmp]==0){
                    hide[tmp] = hide[num]+1;
                    queue.offer(tmp);
                }
            }


        }
    }
    static boolean checking(int x){
        return (x>=0 && x<length);
    }
}

설명💡


처음 문제를 봤을 때 어떻게 해야할지 감이 안잡혀서 노트에 끄적하다보니 생각났다.. 그냥 ArrayList에 하나씩 넣으면 된다는걸..!


한 가지 놓쳤던 점은 수빈이가 동생보다 더 뒤에있을 때는 수빈이가 뒤로 갈 때는 -1씩 밖에 못 움직이기 때문에 그 점은 따로 체크를 해줘야한다.


느낀 점 및 궁금한 점🍀

ArrayList를 만들 때 어떻게 만들지 고민됐는데 써가면서 하니까 그나마 풀기 쉬웠다(?)🫤

0개의 댓글