문제
https://www.acmicpc.net/problem/13913
13913번: 숨바꼭질 4
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
풀이
bfs를 이용해 1 더하거나 1 빼거나 2를 곱한 값들을 큐에 넣으면서 부모 배열을 업데이트 시켜준다. 만약 다음 값이 K라면 while문을 빠져나온 후 부모를 따라가면서 스택에 넣었다가 하나하나 빼면서 출력한다.
코드
import java.util.*;
import java.io.*;
public class Main
{
static int[] parents;
static Queue<Integer> queue;
public static void main(String[] args) throws Exception
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
if (N == K) {
System.out.println(0 + "\n" + K);
return;
}
parents = new int[100001];
Arrays.fill(parents, -1);
StringBuffer sb = new StringBuffer();
queue = new LinkedList<Integer>();
queue.offer(N);
while(!queue.isEmpty()) {
int temp = queue.poll();
int add = temp + 1;
int sub = temp - 1;
int mul = temp * 2;
if (add == K || sub == K || mul == K) {
parents[K] = temp;
break;
}
if (add <= 100000 && parents[add] == -1)
move(add, temp);
if (sub >= 0 && parents[sub] == -1)
move(sub, temp);
if (mul <= 100000 && parents[mul] == -1)
move(mul, temp);
}
int cur = K;
Stack<Integer> stack = new Stack<Integer>();
while (cur != N) {
stack.push(cur);
cur = parents[cur];
}
sb.append(stack.size() + "\n" + N + " ");
while (!stack.empty())
sb.append(stack.pop() + " ");
System.out.println(sb);
}
public static void move(int val, int parent) {
parents[val] = parent;
queue.offer(val);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ 백준] 1991 - 트리 순회, Java(자바) (0) | 2023.03.04 |
---|---|
[BOJ 백준] 6068 - 시간 관리하기, Java(자바) (0) | 2023.03.03 |
[BOJ 백준] 7576 - 토마토, Java(자바) (0) | 2023.03.02 |
[BOJ 백준] 16988 - Baaaaaaaaaduk2 (Easy), Java(자바) (0) | 2023.03.02 |
[BOJ 백준] 11085 - 군사 이동, Java(자바) (0) | 2023.02.06 |