코테/백준

[백준/JAVA] 1697번: 숨바꼭질

imname1am 2023. 5. 26. 18:35
반응형

🔺 문제

 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

 

🔺 코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import java.util.*;
import java.io.*;
public class Main {
    static int N, K;
    static int[] arr = new int[100001];
    static int minTime = Integer.MAX_VALUE;
    static int next;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        
        N = Integer.parseInt(st.nextToken());   // 수빈
        K = Integer.parseInt(st.nextToken());   // 동생
        
        if(N >= K) { // 수빈이는 -1로만 이동할 수 있음
            System.out.println(N - K);
            return;
        }
        
        BFS();
        System.out.println(minTime);
    }
    
    static void BFS() {
        Queue<Integer> queue = new LinkedList<>();
        queue.add(N);
        arr[N] = 1; // 시작점 표시
        
        while(!queue.isEmpty()) {
            int now = queue.poll();
            
            if(minTime < arr[now]) return;
            
            for(int d = 0 ; d < 3; d++) {
                if(d == 0)      next = now + 1;
                else if(d == 1) next = now - 1;
                else            next = now * 2;
                
                if(next < 0 || next > 100000continue;
                
                if(next == K) {
                    minTime = arr[now];
                    return// BFS 종료
                }
                
                if(arr[next] == 0 || arr[next] == arr[now] + 1) {
                    queue.add(next);
                    arr[next] = arr[now] + 1;
                }
            }
        }
    }
}
cs
✅ 해결 아이디어
✔ BFS
- 가장 짧은 시간 구하기이므로 BFS 사용

 


🔺 다른 풀이들

- 과정 상세하게 보여주셔서 좋고, 테스트값까지 적어주심👍👍👍 (복습용)

 

[백준/1697/Java] 숨바꼭질 - BFS 풀이

BFS (너비 우선 탐색, Breadth-First Search) 알고리즘에서 기본적인 문제 하나를 풀어보도록 하겠습니다. 문제 1697번: 숨바꼭질 (acmicpc.net) 1697번: 숨바꼭질 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈

smartpro.tistory.com

 

- 풀이를 글로 잘 설명해주셨다! 그리고 굳이 min 변수를 사용할 필요가 없다는 걸 보여주심.

 

[Algorithm] 백준_1697 숨바꼭질 JAVA

수빈이의 위치가 N(0 ≤ N ≤ 100,000), 동생은 K(0 ≤ K ≤ 100,000)에 위치하고 있다. 수빈이는 자신의 위치에서 N+1, N-1, N\*2 만큼 이동할 수 있는데, 이때 수빈이가 동생을 찾을 수 있는 가장 빠른 시간

velog.io

 

- 갠적으로 가장 깔끔하다고 생각하는 풀이. 다음에 이렇게 풀어봐야지

 

[백준] 1697번 숨바꼭질 - Java, 자바

실버 1https://www.acmicpc.net/problem/1697그래프탐색 문제 가장 빠른 시간을 구해야하는 문제여서 BFS로 접근했다. 이 문제에서 헤맸던 점은 걸린 시간을 count로 코드로 짜다보니 결과가 너무 크게 나왔

velog.io


💬 느낀 점

나는 "숨바꼭질 2" 문제를 먼저 풀었는데

확실히 "숨바꼭질 1" 문제를 풀고 나서 2를 풀었으면 훨씬 더 빠르게 풀 수 있었을 것 같다.

 

그래도 바로 전에, 숨바꼭질 2 풀었을 때 디버깅해보면서 코드 이해했고,

그거 토대로 이번 문제 코드는 스스로 작성해보려고 해서 그런지

숨바2보다는 훨 빠르게 풀었다..!

 

이래서 많이 풀어보는 게 중요헌 것 같다,,,,

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

✔ 숨바꼭질 문제 시리즈...

 

[백준/JAVA] 12851번: 숨바꼭질 2

🔺 문제 12851번: 숨바꼭질 2 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만

bono039.tistory.com

 

반응형