백준 - 12851 - 숨바꼭질2

2021. 3. 26. 22:35Algorithm

www.acmicpc.net/problem/12851

 

12851번: 숨바꼭질 2

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 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
55
56
57
58
59
60
61
62
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
 
/**
 * 백준 - 12851
 */
public class 숨바꼭질2 {
    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]);
 
        if(N >= K) {
            System.out.println(N-K);
            System.out.println(1);
            return;
        }
 
        bfs(N, K);
    }
 
    private static void bfs(Integer N, Integer K) {
        int count = 0;
        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();
 
            if(dist[K] != -1 && dist[K] < dist[curNode]) {
                break;
            }
 
            int[] nextPos = new int[]{curNode-1, curNode+1, curNode*2};
            for(int i=0; i<nextPos.length; i++) {
                Integer nextNode = nextPos[i];
 
                if(nextNode < 0 || nextNode > 100000continue;
 
                if(dist[nextNode] == -1 || dist[nextNode] == dist[curNode] + 1) {
                    q.offer(nextNode);
                    dist[nextNode] = dist[curNode] + 1;
 
                    if(nextNode.equals(K)) {
                        count++;
                    }
                }
            }
        }
 
        System.out.println(dist[K]);
        System.out.println(count);
    }
}
 
cs

알고리즘

  • BFS
  • 트리의 특정 높이에 있는 노드들 중에 특정 노드의 수를 구하는 문제.
  • BFS의 흐름이 머리속에 그려져야 풀수있다.
  • BFS는 루트 노드부터 시작해서 자식을 순차적으로(너비우선탐색) 탐색한다.
  • 따라서 최단 거리의 경우부터 탐색되며, 같은 높이의 특정 노드를 탐색하기 위해서는 중복을 허용해야한다.
  • 단, 모든 중복을 허용할 경우,, 답이 안나온다..방문했던 곳을 또 방문하면 끝이 없기 때문이다..
  • 중복을 허용하는 기준은
  • 방문하지 않았거나(dist[nextNode] == -1)
  • 방문했지만 방문했던 곳이 다음 노드의 형제이면 중복을 허용해준다. (dist[nextNode] == dist[curNode] + 1)
  • 또한 해당 높이를 모두 탐색한 후에는 그 다음 높이의 탐색은 불필요하므로 생략한다 (if(dist[K] != -1 && dist[K] < dist[curNode]) break;
  • 또 주의해야할 점은 N이 K보다 크거나 같은 경우 -1하면서 계속 뒤로 가는 수밖에 없기 때문에 BFS가 아닌 예외적으로 따로 처리해 주어야한다.

'Algorithm' 카테고리의 다른 글

백준 - 13913 - 숨바꼭질4  (0) 2021.03.27
백준 - 13549 - 숨바꼭질3  (0) 2021.03.27
백준 - 1697 - 숨바꼭질  (0) 2021.03.26
백준 - 2644 - 촌수계산  (0) 2021.03.25
백준 - 1987 - 알파벳  (0) 2021.03.25