코딩/알고리즘
[ 백준 ] [ 자바 ][ 숨박꼭질] 1697
알파세
2019. 6. 16. 19:36
런타임 에러가 자꾸 나서 뭔가했는데
if 문에서 맨 좌측에 visited배열을 참조 하게끔 선언해놓아서
범위 이상값을 참조하게 되는 경우도 있어 런타임 에러가 뜨는 것이였다.
처음에는 dfs로 진행하다가 스택오버플로우를 겪게 되서 bfs로 진행했는데
과거에 작성했던 코드보다는 깔끔해진것같다.
package back;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Position{
int position;
Position(int position){
this.position = position;
}
}
public class Main_backjoon_1697_숨박꼭질_retry {
static int N;
static int K;
static int TIME;
static boolean[] VISITED =new boolean[1000001];
static Queue q = new LinkedList();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
K = sc.nextInt();
move();
}
public static void move() {
q.add(new Position(N));
VISITED[N] = true;
boolean findFlag = false ;
while(!q.isEmpty()) {
int qsize = q.size();
for(int s = 0 ; s< qsize; s++) {
Position p = q.poll();
//System.out.println(p.position);
if( p.position == K) {
findFlag = true;
break;
}
for(int i = 0 ; i <3 ; i++) {
int pos = 0;
if(i == 0) { pos = p.position * 2; } //순간이동
else if(i == 1) { pos = p.position + 1; }
else if(i == 2) { pos = p.position - 1; }
if( pos <= 100000 && pos >= 0 && !VISITED[pos] ) {
VISITED[pos] = true;
q.add(new Position(pos));
}
}
}
if( findFlag ) {
System.out.println(TIME);
return ;
}
TIME += 1;
}
}
}