본문 바로가기
PS/Baekjoon

[Baekjoon] 1697 - 숨바꼭질

by 서현 SEOHYEON 2023. 7. 11.

📝 문제

 

 

🔑 풀이 과정

되게 쉽게 봤다가 큰 코 다친 문제.

 

① 처음에 뭐에 홀린건지 DFS로 풀었다가 스택오버플로우 에러나면서 실패. 생각해보면 당연하다. 답이 없는 가지로 들어가면 끝까지 들어가니... 가장 빠른 시간(최소)을 찾는 문제이므로 BFS를 쓰자.

② 그다음 BFS로 풀었을 때 바로 틀렸습니다 받음... 반례를 찾아보니 처음 입력받은 N과 K가 같을 때(답이 0일때)를 고려하지 않았다. 기존코드는 val-1, val+1, val*2을 K와 비교하는 코드만 있었다. 코드를 수정해서 현재의 val과 K를 비교하게 만들었다.

//실패했던 반례

100000 100000 //출력: 0

③ 이게 나에게는 정말 찾기 힘들었던 부분인데, 한 번 들렀던 위치는 다시 큐에 추가하게끔 하면 안된다. (어차피 -1, +1, *2 연산을 반복하니까 하나의 위치는 한번만 추가하면 된다.). 즉, 방문배열을 써주자. 방문배열이 없었더니 했던 루트를 또 추가하고 또 추가하고를 반복해서 인지 아무리 기다려도 출력이 안되는 상황이 발생했다. (입력이 1일때를 생각하면 -1 계산시 0, +1 계산시 2, *2 계산시 2로 반복되는 값이 나온다. 한 루트는 버려도 된다.)

N, K의 범위가 0부터 100000까지로 주어진게 int를 초과하지 않는다는 힌트를 준거라 생각한건데, 배열 인덱스로 쓰라는 것이었나 보다.

//실패했던 반례

100 0 //출력: 100
0 100000 //출력: 22

 

 

🔓 답안

import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

    static int K;

    static int ans;

    static boolean[] visited = new boolean[100001];

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        //입력
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken()); //수빈이의 위치
        K = Integer.parseInt(st.nextToken()); //동생의 위치
        //입력 종료

        //BFS 수행
        BFS(0, N);

        //출력
        bw.write(ans + "\n");
        bw.flush();
        bw.close();
    }

    static void BFS(int second, int n){
        Queue<int[]> queue = new LinkedList<>();
        visited[n] = true;
        queue.add(new int[] {second, n}); //현재 시간과, 현재 위치를 넣을 큐를 생성

        while(!queue.isEmpty()){
            int[] now = queue.remove();
            int time = now[0];
            int val = now[1];

            if(val == K){
                ans = time;
                return;
            }

            if(((val - 1) >= 0) && ((val - 1) <= 100000) && (!visited[val - 1])){
                visited[val-1] = true;
                queue.add(new int[] {time+1, val-1});
            }
            if(((val + 1) >= 0) && ((val + 1) <= 100000) && (!visited[val + 1])){
                visited[val+1] = true;
                queue.add(new int[] {time+1, val+1});
            }
            if(((val * 2) >= 0) && ((val * 2) <= 100000) && (!visited[val * 2])){
                visited[val*2] = true;
                queue.add(new int[] {time+1, val*2});
            }
        }
    }

}

- BFS 메서드 하단부분을 val-1은 0이상인지만, val+1, val*2는 100000이하인지만 검사해도 된다. val이 무조건 양수이기 때문이다.

 

 

🖤 알고리즘 분류

- 그래프 이론

- 그래프 탐색

- 너비 우선 탐색

'PS > Baekjoon' 카테고리의 다른 글

[Baekjoon] 2468 - 안전 영역  (0) 2023.07.13
[Baekjoon] 4963 - 섬의 개수  (0) 2023.07.12
[Baekjoon] 7576 - 토마토  (0) 2023.07.10
[Baekjoon] 9375 - 패션왕 신해빈  (0) 2023.07.09
[Baekjoon] 1620 - 나는야 포켓몬 마스터 이다솜  (0) 2023.07.09

댓글