백준 #1697 숨바꼭질
문제 설명👩🏫
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
입력
5 17
출력
4
내 코드💻
import java.io.*;
import java.util.*;
public class Main {
static ArrayList<Integer>[] list;
static int start, end,length;
static int[] visited;
static int[] hide;
static Queue<Integer> queue = new LinkedList<>();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str," ");
start = Integer.parseInt(st.nextToken());
end = Integer.parseInt(st.nextToken());
if(start <= end) {
length = end + 2;
visited = new int[length];
hide = new int[length];
list = new ArrayList[length];
for (int i = 0; i < length; i++) {
list[i] = new ArrayList<>();
int n = i;
list[i].add(n - 1);
list[i].add(n + 1);
list[i].add(n * 2);
}
queue.offer(start);
bfs();
System.out.println(hide[length - 2]);
}
else{
System.out.println(start-end);
}
}
static void bfs(){
while(!queue.isEmpty()){
int num = queue.poll();
visited[num]=1;
for(int j=0;j<list[num].size();j++) {
int tmp = list[num].get(j);
if(checking(tmp) && visited[tmp]==0 &&hide[tmp]==0){
hide[tmp] = hide[num]+1;
queue.offer(tmp);
}
}
}
}
static boolean checking(int x){
return (x>=0 && x<length);
}
}
설명💡
처음 문제를 봤을 때 어떻게 해야할지 감이 안잡혀서 노트에 끄적하다보니 생각났다.. 그냥 ArrayList에 하나씩 넣으면 된다는걸..!
한 가지 놓쳤던 점은 수빈이가 동생보다 더 뒤에있을 때는 수빈이가 뒤로 갈 때는 -1씩 밖에 못 움직이기 때문에 그 점은 따로 체크를 해줘야한다.
느낀 점 및 궁금한 점🍀
ArrayList를 만들 때 어떻게 만들지 고민됐는데 써가면서 하니까 그나마 풀기 쉬웠다(?)🫤