https://www.acmicpc.net/problem/13549
13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
문제 풀이
import java.io.*;
import java.util.*;
public class Main {
static class Dot {
int pos, time; // pos : position
public Dot(int pos, int time) {
this.pos = pos;
this.time = time;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()),
k = Integer.parseInt(st.nextToken());
br.close();
final int max = 100001; Dot dot;
int answer = 0, pos, time, p[], t[], pos_next, time_next, i;
PriorityQueue<Dot> pq = new PriorityQueue<>((d1, d2) ->
(d1.time == d2.time ? d1.pos - d2.pos : d1.time - d2.time)); // priority queue
pq.add(new Dot(n, 0));
boolean v[] = new boolean[max]; // visited
v[n] = true;
loop:
while (!pq.isEmpty()) {
dot = pq.remove();
pos = dot.pos;
time = dot.time;
p = new int[]{pos * 2, pos + 1, pos - 1};
t = new int[]{time, time + 1, time + 1};
for (i = 0; i < 3; ++i) {
pos_next = p[i];
time_next = t[i];
if (pos_next < 0 || pos_next >= max || v[pos_next])
continue;
if (pos_next == k) {
answer = time_next;
break loop;
}
pq.add(new Dot(pos_next, time_next));
v[pos_next] = true;
}
}
System.out.println(answer);
}
}
아래의 두 문제와 달리
순간 이동을 하는 경우 0초가 소요된다
또한 다익스트라로 해결하는 문제이므로
순간이동을 하는 경우의 가중치는 0(초),
한 칸 앞으로 가거나 뒤로 가는 경우의 가중치는 1(초)로 하여
우선순위 큐를 사용하여야 한다
이 때 우선순위에 대한 기준은
첫 번째로 소요시간(초)이 적은 순,
두 번째로 위치가 더 이전인 순 (소요시간이 같을 경우)
https://hyunjiishailey.tistory.com/157
[백준(Baekjoon)][자바(java)] 1697 : 숨바꼭질 / DFS와 BFS
www.acmicpc.net/problem/1697 1697번: 숨바꼭질 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을..
hyunjiishailey.tistory.com
https://hyunjiishailey.tistory.com/564
[백준(Baekjoon)][자바(java)] 13913 : 숨바꼭질 4 / 동적 계획법과 최단거리 역추적
https://www.acmicpc.net/problem/13913 13913번: 숨바꼭질 4 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거..
hyunjiishailey.tistory.com
'코딩 문제 풀기 ( Algorithm problem solving ) > 백준 온라인 저지 ( BOJ )' 카테고리의 다른 글
[백준(Baekjoon)][자바(java)] 10816 : 숫자 카드 2 / 집합과 맵 (0) | 2022.05.12 |
---|---|
[백준(Baekjoon)][자바(java)] 10815 : 숫자 카드 / 집합과 맵 (0) | 2022.05.12 |
[백준(Baekjoon)][자바(java)] 14003 : 가장 긴 증가하는 부분 수열 5 / 동적 계획법과 최단거리 역추적, 이분 탐색 (0) | 2022.01.18 |
[백준(Baekjoon)][자바(java)] 12738 : 가장 긴 증가하는 부분 수열 3 / 이분 탐색 (0) | 2022.01.18 |
[백준(Baekjoon)][자바(java)] 11780 : 플로이드 2 / 동적 계획법과 최단거리 역추적 (0) | 2022.01.17 |