본문 바로가기

알고리즘/백준

[JAVA]백준_13913번_숨바꼭질4

문제 : https://www.acmicpc.net/problem/13913

 

13913번: 숨바꼭질 4

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

www.acmicpc.net

문제유형 : BFS + DP

 

풀이방식 :

(1) visited 배열에 이전 위치를 기억하면서 현재+1, 현재-1, 현재*2 이동

(2) 동생을 찾으면 거꾸로 경로를 result 배열에 정리 

 

 

소스코드

package BOJ;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BOJ_13913_숨바꼭질4_Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine()," ");
		int N = Integer.parseInt(st.nextToken()); // 수빈
		int K = Integer.parseInt(st.nextToken()); // 동생
		
		if(N!=K) {
			int[] visited = new int[100001];
			int[] result = new int[100001];
			Arrays.fill(visited, -1);
			Queue<Integer> q = new LinkedList<Integer>();
			q.offer(N);
			int ans = 0;
	loop:	while(!q.isEmpty()) {
					ans++;
					int size = q.size();
					for (int s = 0; s < size; s++) {
						int now = q.poll();
						
						if(now-1>-1&& now-1<100001&&visited[now-1]==-1) {
							visited[now-1] = now;
							q.offer(now-1);
							if(now-1==K) {
								result[ans] = now-1;
								break loop;
							}
						}
						
						if(now+1>-1&& now+1<100001&&visited[now+1]==-1) {
							visited[now+1] = now;
							q.offer(now+1);
							if(now+1==K) {
								result[ans] = now+1;
								break loop;
							}
						}
						
						if(now*2>-1&& now*2<100001&&visited[now*2]==-1) {
							visited[now*2] = now;
							q.offer(now*2);
							if(now*2==K) {
								result[ans] = now*2;
								break loop;
							}
						}
					}
					
				}
			
				System.out.println(ans);
				for (int i = ans-1, now = K; i > -1; i--) {
					result[i] = visited[now];
					now = visited[now];
				}
				for (int i = 0; i <= ans; i++) {
					System.out.print(result[i]+" ");
				}
		}else {
			System.out.println("0");
			System.out.println(N);
		}
		
	}

}

'알고리즘 > 백준' 카테고리의 다른 글

[JAVA]백준_2503_숫자야구  (0) 2020.08.06
[JAVA]백준_3187_양치기꿍  (0) 2020.08.05
[JAVA]백준_11967_불켜기  (0) 2020.08.04
[JAVA]백준_1347_미로만들기  (0) 2020.08.04
[JAVA]백준_1120번_문자열  (0) 2020.08.03