728x90
문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
풀이
최소의 값을 찾는 방법은 BFS를 이용한다.
현 위치로부터 수빈이가 이동할 수 있는 3개의 경우수를 각각 돌리면서 방문하지 않은 위치라면 방문시킨다.
코드
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;
boolean[] chk = new boolean[100001];
chk[n]=true;
while(q.size()>0) {
cur = q.poll();
if(cur[0]==k)
break;
else if(cur[0]<0 || cur[0]>100000)
continue;
if(cur[0]+1>=0 && cur[0]+1<=100000 && !chk[cur[0]+1]) {
chk[cur[0]+1]=true;
q.add(new int[] {cur[0]+1, cur[1]+1});
}
if(cur[0]-1>=0 && cur[0]-1<=100000 && !chk[cur[0]-1]) {
chk[cur[0]-1]=true;
q.add(new int[] {cur[0]-1, cur[1]+1});
}
if(cur[0]*2>=0 && cur[0]*2<=100000 && !chk[cur[0]*2])
{
chk[cur[0]*2]=true;
q.add(new int[] {cur[0]*2, cur[1]+1});
}
}
System.out.println(cur[1]);
}
}
728x90
728x90
'Algorithm > Baekjoon' 카테고리의 다른 글
Baekjoon 1874 스택 수열 JAVA (0) | 2022.03.08 |
---|---|
Baekjoon 16953 A → B JAVA (0) | 2022.03.06 |
Baekjoon 11726 2×n 타일링 JAVA (0) | 2022.03.06 |
Baekjoon 11659 구간 합 구하기 4 JAVA (0) | 2022.03.04 |
Baekjoon 4949 균형잡힌 세상 JAVA (0) | 2022.03.02 |
댓글