백준 - 1697 - 숨바꼭질

2021. 3. 26. 16:40Algorithm

www.acmicpc.net/problem/1697

 

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
import java.util.*;
 
/**
 * 백준 - 1697
 */
public class 숨바꼭질 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] inputs = sc.nextLine().split(" ");
        Integer N = Integer.valueOf(inputs[0]);
        Integer K = Integer.valueOf(inputs[1]);
 
        System.out.println(bfs(N, K));
    }
 
    private static int bfs(Integer N, Integer K) {
        Queue<Integer> q = new LinkedList<>();
        int[] dist = new int[100001];
        Arrays.fill(dist, -1);
 
        q.offer(N);
        dist[N] = 0;
 
        while (!q.isEmpty()) {
            Integer curNode = q.poll();
 
            int[] nextPos = new int[]{curNode-1, curNode+1, curNode*2};
            for(int i=0; i<nextPos.length; i++) {
                Integer nextNode = nextPos[i];
                if(0 <= nextNode && nextNode <= 100000 && dist[nextNode] == -1) {
                    q.offer(nextNode);
                    dist[nextNode] = dist[curNode] + 1;
 
                    if(nextNode == K) {
                        q.clear();
                        break;
                    }
                }
            }
        }
 
        return dist[K];
    }
}
 
cs

알고리즘

  • BFS
  • DFS를 사용할 경우, 완전 탐색하면서 최단거리를 계속 체크해줘야하는 단점이 있다. BFS를 이용할 경우 시작 노드로부터 가까운 노드부터 방문하기 때문에 그냥 처음 방문된 목적 노드가 가장 거리가 짧은 노드가 돼서, 목적 노드 방문시 로직을 종료할 수 있다.
  • 방문 체크는 따로 메모리 할당을 하지 않고 최단거리배열(dist)의 수정 여부로 체크하였다. 

'Algorithm' 카테고리의 다른 글

백준 - 13549 - 숨바꼭질3  (0) 2021.03.27
백준 - 12851 - 숨바꼭질2  (0) 2021.03.26
백준 - 2644 - 촌수계산  (0) 2021.03.25
백준 - 1987 - 알파벳  (0) 2021.03.25
백준 - 1759 - 암호 만들기  (0) 2021.03.23