알고리즘 풀이/백준
[1697] 백준 - 숨바꼭질(JAVA)
데롱디롱
2021. 8. 4. 16:38
728x90
- Queue에 들려야 하는 위치를 계속 넣어주는 BFS방법을 이용하여 풀었다.
- 동생한테 가는 방법은 [ X + 1 ] , [ X - 1 ] , [ X * 2 ] 이렇게 3가지이다.
- 동생의 현재 위치가 최대 100000이지만, 100002에서 오는 경우 등 최대 수를 넘을 수도 있다고 생각하여,
넉넉하게 배열을 200001로 크기를 주었다.
- 다음에 방문할 곳이( X + 1 , X - 1 , X * 2 )
0보다 크고, 배열 최대 크기보다 작다면 탐색을 해보아야 하는 곳으로 정하고
방문 처리를 한 후, queue에 넣어주었다.
- 동생을 찾으면 isFind를 true로 해주어, 더이상 탐색하지 않도록 하였다.
- 소요된 시간은 time에 +해주었다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
boolean road[] = new boolean[200001];
road[N] = true; // 방문처리
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(N);
int time = 0;
boolean isFind = false;
while (!queue.isEmpty() && !isFind) {
int size = queue.size();
while (--size >= 0 && !isFind) {
int num = queue.poll();
if (num == K) {
isFind = true;
break;
}
if (num > 0 && !road[num - 1]) {
queue.offer(num - 1);
road[num - 1] = true;
}
if (num + 1 < 200000 && !road[num + 1]) {
queue.offer(num + 1);
road[num + 1] = true;
}
if (num * 2 < 200000 && !road[num * 2]) {
queue.offer(num * 2);
road[num * 2] = true;
}
}
time++;
}
System.out.println(time - 1);
}
}