백준 - 13549 - 숨바꼭질3

2021. 3. 27. 00:12Algorithm

www.acmicpc.net/problem/13549

 

13549번: 숨바꼭질 3

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 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
63
64
import java.util.*;
 
/**
 * 백준 - 13549
 */
public class 숨바꼭질3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] inputs = sc.nextLine().split(" ");
        int N = Integer.parseInt(inputs[0]);
        int K = Integer.parseInt(inputs[1]);
 
        System.out.println(dijkstra(N, K));
    }
 
    private static int dijkstra(int N, int K) {
        Queue<Node> q = new PriorityQueue<>();
        int[] dist = new int[100001];
        Arrays.fill(dist, Integer.MAX_VALUE);
 
        Node startNode = new Node();
        startNode.nodeNum = N;
        startNode.second = 0;
        q.offer(startNode);
        dist[N] = 0;
 
        while (!q.isEmpty()) {
            Node curNode = q.poll();
 
            if(dist[curNode.nodeNum] < curNode.second) continue;
 
            int[] nextPos = new int[]{curNode.nodeNum - 1, curNode.nodeNum + 1, curNode.nodeNum * 2};
            for(int i=0; i<nextPos.length; i++) {
                if(0 > nextPos[i] || nextPos[i] > 100000continue;
 
                Node nextNode = new Node();
                nextNode.nodeNum = nextPos[i];
                nextNode.second = (i == 0 || i == 1) ? 1 : 0;
 
                if(dist[nextNode.nodeNum] > dist[curNode.nodeNum] + nextNode.second) {
                    q.offer(nextNode);
                    dist[nextNode.nodeNum] = dist[curNode.nodeNum] + nextNode.second;
                }
            }
        }
 
        return dist[K];
    }
 
    private static class Node implements Comparable<Node>{
        private int nodeNum;
        private int second;
 
        @Override
        public int compareTo(Node o) {
            int ret = this.second - o.second;
            if(ret == 0) {
                ret = this.nodeNum - o.nodeNum;
            }
            return ret;
        }
    }
}
 
cs

알고리즘

  • 다익스트라
  • 숨바꼭질, 숨바꼭질2와는 다르게 가중치가 다르기 때문에 다익스트라로 구현하였다.
  • 다익스트라를 구현할 수 있으면 풀 수 있는 문제.

'Algorithm' 카테고리의 다른 글

프로그래머스 - 그래프 - 가장 먼 노드  (0) 2021.03.29
백준 - 13913 - 숨바꼭질4  (0) 2021.03.27
백준 - 12851 - 숨바꼭질2  (0) 2021.03.26
백준 - 1697 - 숨바꼭질  (0) 2021.03.26
백준 - 2644 - 촌수계산  (0) 2021.03.25