문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
💡풀이
주어진 N에 대해 $(N-1), (N+1), (2*N)$을 N에 인접한 노드라 생각하면 그래프가 그려질 것이다. 이를 BFS를 이용해 목표 지점인 K까지의 최단 거리를 구하는 방법을 사용하면 된다.
int형 배열 node에 $\{cur-1, cur+1, cur*2\}$를 넣고 이를 큐(Queue)에 넣어 BFS를 시도했다. 각 노드에 해당하는 거리의 정보를 입력하는 $distance$배열을 처음에 -1로 초기화 시켜주고, 이를 이용해 방문 체크를 하였다($distance[next]==-1$이면 방문하지 않은 노드).
이때 주의할 점은 각 node의 범위인데, 문제에 주어진 N의 범위를 그대로 이용해, $0<=node<100,001$로 설정하였다. 만약 $K$와 같은 노드가 발견된다면 $distance[node]$를 출력하고 종료한다.
전체 코드는 다음과 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Q1697 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
String str = br.readLine();
st = new StringTokenizer(str, " ");
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[] distance = new int[100001];
Arrays.fill(distance, -1);
Queue<Integer> queue = new LinkedList<>();
distance[N] = 0;
queue.offer(N);
while(!queue.isEmpty()){
int cur = queue.poll();
int[] node = new int[]{cur-1, cur+1, cur*2};
for(int next:node){
if(next>=0 && next<100001 && distance[next] == -1) {
distance[next] = distance[cur] + 1;
queue.offer(next);
}
if(next == K){
System.out.println(distance[next]);
return;
}
}
}
}
}
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ] 2606 : 바이러스(Java) (0) | 2022.08.06 |
---|---|
[BOJ] 2468 : 안전 영역(Java) (0) | 2022.08.06 |
[BOJ] 1339 : 단어 수학(Java) (0) | 2022.08.04 |
[BOJ] 1969 : DNA(Java) (0) | 2022.08.04 |
[BOJ] 11047 : 동전0(Java) (0) | 2022.08.04 |