728x90
문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 0초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
풀이
최소의 값을 찾는 방법은 BFS를 이용한다.
현 위치로부터 수빈이가 이동할 수 있는 3개의 경우수를 각각 돌리면서 방문하지 않은 위치라면 방문시킨다.
다만 *2를 하는 작업은 시간이 0이기에 방문하지 않은 장소는 -1로 값을 초기화해서 0인 값도 사용할 수 있도록 해준다.
2022.03.06 - [Algorithm/Baekjoon] - Baekjoon 1697 숨바꼭질 JAVA
코드
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), k = sc.nextInt();
Queue<int[]> q = new LinkedList<int[]>();
q.add(new int[] { n, 0 });
int[] cur = null, chk = new int[100010];
for(int i=0;i<100001;i++)
chk[i]=-1;
chk[n] = 0;
while (q.size() > 0) {
cur = q.poll();
if (cur[0] < 0 || cur[0] > 100000)
continue;
if (cur[0] * 2 >= 0 && cur[0] * 2 <= 100000 && (chk[cur[0] * 2]>cur[1] || chk[cur[0]*2]==-1)) {
chk[cur[0] * 2] = cur[1];
q.add(new int[] { cur[0] * 2, cur[1] });
}
if (cur[0] + 1 >= 0 && cur[0] + 1 <= 100000 && (chk[cur[0] + 1]>cur[1]+1 || chk[cur[0]+1]==-1) ) {
chk[cur[0] + 1] = cur[1]+1;
q.add(new int[] { cur[0] + 1, cur[1] + 1 });
}
if (cur[0] - 1 >= 0 && cur[0] - 1 <= 100000 && (chk[cur[0] - 1]>cur[1]+1 || chk[cur[0]-1]==-1)) {
chk[cur[0] - 1] = cur[1]+1;
q.add(new int[] { cur[0] - 1, cur[1] + 1 });
}
}
System.out.println(chk[k]);
}
}
728x90
728x90
'Algorithm > Baekjoon' 카테고리의 다른 글
Baekjoon 17626 Four Squares JAVA (0) | 2022.03.21 |
---|---|
Baekjoon 9095 1, 2, 3 더하기 JAVA (0) | 2022.03.20 |
Baekjoon 14503 로봇 청소기 JAVA (0) | 2022.03.20 |
Baekjoon 10867 중복 빼고 정렬하기 JAVA (0) | 2022.03.16 |
Baekjoon 9205 맥주 마시면서 걸어가기 JAVA (0) | 2022.03.15 |
댓글