카테고리 없음
백준 12851번 숨바꼭질 2 (JAVA)
박카스마시며코딩
2021. 12. 4. 18:38
https://www.acmicpc.net/problem/12851
12851번: 숨바꼭질 2
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때
www.acmicpc.net
처음에는 방문체크를 하지 않고 진행하여 메모리 초과가 나왔습니다.
visited배열을 통해 방문 체크를 하였습니다. 하지만 해당하는 경우의 수도 같이 출력해야하기 때문에 Queue에 넣을 때 visited를 true로 만들지 않고 queue에서 깨낼 때 visited를 true로 만들었습니다.
그리고 배열의 크기는 LIMIT의 2배까지 되게 만든 이유는 2배로 갔다가 뒤로 가는 경우도 존재할 수 있다고 생각하였습니다. 근데 2 * LIMIT 이상이라면 더 효율적이게 될 것이라 판단하여 이 이상가는 것은 막았습니다.
package BOJ;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_12851 {
static int n,m;
static final int LIMIT = 100_000;
static boolean visited[] = new boolean[2*LIMIT+1];
static void cal(){
Queue<Integer> q = new LinkedList<>();
q.offer(n);
int time = 0;
int cnt =0;
boolean flag = false;
while(!q.isEmpty()){
int size = q.size();
for(int t = 0 ; t < size ; t++){
int now = q.poll();
visited[now] = true;
if(now == m){
flag = true;
cnt++;
}
if(now -1 >=0 && !visited[now-1]){
q.offer(now - 1);
}
if(now + 1 <= LIMIT && !visited[now+1]){
q.offer(now + 1);
}
if(now < LIMIT && !visited[2 * now]){
q.offer(2 * now);
}
}
if(flag){
break;
}
time++;
}
System.out.println(time);
System.out.println(cnt);
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
Function<String,Integer> stoi = Integer::parseInt;
n = stoi.apply(st.nextToken());
m = stoi.apply(st.nextToken());
cal();
}
}