안녕하세요. 이번에는 백준 1697 숨바꼭질 문제를 풀어보려고 합니다.
https://www.acmicpc.net/problem/1697
Problem
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
Solution
import java.io.*;
import java.util.*;
public class Main {
static int N, K;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] arr = br.readLine().split(" ");
N = Integer.parseInt(arr[0]);
K = Integer.parseInt(arr[1]);
if(N == K) {
System.out.println(0);
} else {
bfs(N);
}
}
public static void bfs(int n) {
// 범위가 (0 ≤ N ≤ 100,000) 이기 때문에 100001
boolean[] visited = new boolean[100001];
Queue<Integer> q = new LinkedList<>();
q.offer(n);
int size = q.size();
int count = 0;
while(true) {
count++;
size = q.size();
for(int i = 0; i < size; i++) {
int x = q.poll();
visited[x] = true;
if(x - 1 == K || x + 1 == K || x * 2 == K) {
System.out.println(count);
return;
}
if(x - 1 > 0 && !visited[x - 1]) {
q.offer(x - 1);
visited[x - 1] = true;
}
if(x + 1 < 100001 && !visited[x + 1]) {
q.offer(x + 1);
visited[x + 1] = true;
}
if(x * 2 < 100001 && !visited[x * 2]) {
q.offer(x * 2);
visited[x * 2] = true;
}
}
}
}
}
Performance
반응형
'백준 Algorithm > 백준 CLASS3' 카테고리의 다른 글
[백준] CLASS3 1927 최소 힙 - JAVA [자바] (0) | 2023.10.24 |
---|---|
[백준] CLASS3 1764 듣보잡 - JAVA [자바] (2) | 2023.10.23 |
[백준] CLASS3 1620 나는야 포켓몬 마스터 이다솜 - JAVA [자바] (0) | 2023.10.21 |
[백준] CLASS3 1463 1로 만들기 - JAVA [자바] (0) | 2023.10.20 |
[백준] CLASS3 1074 Z - JAVA [자바] (2) | 2023.10.19 |