문제 : 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 |