ALGORITHM
백준 13549 숨바꼭질 3 (Java)
공부하는_다온
2023. 5. 20. 22:05
1. 문제 링크
13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
2. 문제 및 입출력예제
3. 문제 풀이
- BFS를 이용해서 풀었다.
- 시간이 0초 걸리는 *2 연산을 앞에 두고 +1, -1을 진행했다.
원래는 bfs로 풀리는 문제는 아닌데 *2 연산을 먼저 진행해서 풀린 것 같다.
약간 1의 위치에 있었을 때 *2를 먼저 해야 +1보다 먼저 방문하니까 시간이 덜 걸리기 때문에 무조건 *2를 앞에 둬야 한다.
4. 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] split = br.readLine().split(" ");
int N = Integer.parseInt(split[0]);
int M = Integer.parseInt(split[1]);
Queue<int[]> queue = new ArrayDeque<>();
boolean[] visit = new boolean[100001];
queue.offer(new int[] { N, 0 });
visit[N] = true;
int result = 0;
out:
while (!queue.isEmpty()) {
int[] temp = queue.poll();
int where = temp[0];
int num = temp[1];
if (temp[0] == M) {
result = num;
break out;
}
if (where * 2 <= 100000 && !visit[where * 2]) {
queue.offer(new int[] { where * 2, num });
visit[where * 2] = true;
}
if (where - 1 >= 0 && !visit[where - 1]) {
queue.offer(new int[] { where - 1, num + 1 });
visit[where - 1] = true;
}
if (where + 1 <= 100000 && !visit[where + 1]) {
queue.offer(new int[] { where + 1, num + 1 });
visit[where + 1] = true;
}
}
System.out.println(result);
}
}