smooth waters run deep

1d-1c/BOJ

1697_숨바꼭질 (JAVA)

yeon_11 2020. 10. 23. 23:06
 

1697번: 숨바꼭질

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

www.acmicpc.net

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	static int N;
	static int K;
	static int[] visited = new int[100001];

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		K = sc.nextInt();

		if(N>=K)
			System.out.println(N-K);
		else
			BFS(N);
	}

	public static void BFS(int N){
		Queue<Integer> q = new LinkedList<Integer>();
		q.offer(N);
		visited[N] = 1;
		
		while(!q.isEmpty()){
			int cur = q.poll();
			for(int i=0; i<3; i++){
				int next;
				if(i==0)
					next = cur-1;
				else if(i==1)
					next = cur+1;
				else
					next = cur*2;

				if(next == K){
					System.out.println(visited[cur]);
					return;
				}
				if(next>=0 && next<=100000) {
					if (visited[next] == 0) {
						q.offer(next);
						visited[next] = visited[cur]+1;
					}
				}
			}
		}
	}
}

 

 

[문제 풀이 생각 과정]

 

1. 이동할 수 있는 경우는 -1, +1, *2 이렇게 세 가지 경우이다.

 

2. for문을 이용해 세 가지 경우를 next로 설정한다.

 

3. next==K가 되기까지 다음의 과정을 거친다.

   1) 0 <= next <= 100000 (문제에서 주어진 N,K의 범위)에 next가 해당하고,

      숫자next에 방문했는지 확인한다.

 

   2) 만약 방문안했다면 = visited[next]==0이라면

      큐에 넣고 visited[next]값을 수정한다.

 

   3) visited[next] = visited[cur]+1의 의미는!

      cur -> next로 이동할때 방문안했고 next범위 안에 있다는 조건에 해당하면 +1 해준다.

     

 

 

'1d-1c > BOJ' 카테고리의 다른 글

1662_압축 (JAVA)  (0) 2020.10.26
2606_바이러스 (JAVA)  (0) 2020.10.23
7568_덩치 (JAVA)  (0) 2020.10.22
2231_분배합 (JAVA)  (0) 2020.10.21
3053_택시 기하학 (JAVA)  (0) 2020.10.21