현재 위치 X에서 할 수 있는 일
1. 1초 후, X-1 또는 X+1 로 이동
2. 0초 후, 순간이동
세 가지 경우를 고려하면서 순간이동할때만 시간 안더해주면 되지 않을까 ?
배열의 크기는 수빈이의 현재위치 * 2 +1로 정해둔다.
import java.util.*;
import java.io.*;
public class Main{
static int N, K;
static boolean[] visited;
static int[] dist;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // 수빈이의 현재위치
K = Integer.parseInt(st.nextToken()); // 동생의 현재위치
visited = new boolean[200001];
dist = new int[100001];
bfs(N);
//bfs2(N);
}
static void bfs(int curr) {
LinkedList<Integer> queue = new LinkedList<>();
queue.add(curr);
visited[curr] = true;
int min = Integer.MAX_VALUE;
while(!queue.isEmpty()) {
int out = queue.poll();
if(out == K){
System.out.println(dist[out]);
return ;
}
int[] move = {out, -1, 1};
for(int i=0; i<3; i++) {
int next = out + move[i];
if(next < 0 || next > 100000) continue;
else if(visited[next]) continue;
else {
if(i != 0) { //순간이동하는 경우 아니면
queue.offer(next);
visited[next] = true;
dist[next] = dist[out] + 1;
}
else {
queue.addFirst(next);
visited[next] = true;
dist[next] = dist[out];
}
}
}
}
return ;
}
}
import java.util.*;
import java.io.*;
public class Main {
static int N, K;
static boolean[] visited;
static int[] dist;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // 수빈이의 현재위치
K = Integer.parseInt(st.nextToken()); // 동생의 현재위치
visited = new boolean[100001];
dist = new int[100001];
bfs(N);
}
static void bfs(int curr) {
LinkedList<Integer> queue = new LinkedList<>();
queue.add(curr);
visited[curr] = true;
int min = Integer.MAX_VALUE;
while(!queue.isEmpty()) {
int out = queue.poll();
// visited[out] = true;
if(out == K){
System.out.println(dist[out]);
return ;
}
int[] move = {out, 1, -1};
for(int i=0; i<3; i++) {
int next = out + move[i];
if(next < 0 || next > 100000) continue;
else if( visited[next]) continue;
else {
if(i != 0) { //순간이동하는 경우 아니면
queue.offer(next);
visited[next] = true;
if(dist[next] != 0)
dist[next] = Math.min(dist[next], dist[out]+1);
else
dist[next] = dist[out] + 1;
}
else {
queue.addFirst(next);
visited[next] = true;
if(dist[next] != 0)
dist[next] = Math.min(dist[next], dist[out]);
else
dist[next] = dist[out];
}
}
}
}
return ;
}
}