본문 바로가기
Algorithm/Baekjoon

Baekjoon 1697 숨바꼭질 JAVA

by Hunveloper 2022. 3. 6.
728x90
 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

문제

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 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

댓글