https://www.acmicpc.net/problem/13549
13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때
www.acmicpc.net
문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 0초 후에 2*X의 위치로 이동하게 된다.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
소스코드
import java.util.*;
import java.io.*;
class Main {
static int n, k;
static int arr[];
static boolean visited[];
static class Node implements Comparable<Node> {
int x;
int value;
public Node(int x, int value) {
this.x = x;
this.value = value;
}
@Override
public int compareTo(Node o) {
return this.value - o.value;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
arr = new int[100001];
visited = new boolean[100001];
System.out.println(bfs(n));
}
static int bfs(int x) {
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.add(new Node(x, 0));
if(x == k) return 0;
while(!pq.isEmpty()) {
Node node = pq.poll();
int curX = node.x;
visited[curX] = true;
if(curX == k) return node.value;
if(curX * 2 < 100001 && !visited[curX * 2]) pq.add(new Node(curX * 2, node.value));
if(curX + 1 < 100001 && !visited[curX + 1]) pq.add(new Node(curX + 1, node.value + 1));
if(curX - 1 >= 0 && !visited[curX - 1]) pq.add(new Node(curX - 1, node.value + 1));
}
return -1;
}
}
해결 방법
- BFS를 사용하였고 가중치가 있는 경로이기에 우선순위 큐에 이동 가능한 정점을 넣었다.
- 가중치가 짧은 정점이 우선순위가 되도록 기준을 잡아 가장 먼저 도착하는 정점이 최단 거리가 된다.
- 순서에 따른 의존도가 생기지 않도록 우선순위 큐에서 정점을 꺼냈을 때 방문 처리를 했다.
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 19699번 : 소-난다! (1) | 2024.01.29 |
---|---|
[백준] 21608번 : 상어 초등학교 (0) | 2024.01.28 |
[백준] 2468번 : 안전 영역 (0) | 2024.01.22 |
[백준] 11660번 : 구간 합 구하기 5 (0) | 2024.01.22 |
[백준] 12018번 : Yonsei TOTO (1) | 2024.01.21 |