코딩/알고리즘

[ 백준 ] [ 자바 ][ 숨박꼭질] 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;
				
		}
		
		
	
	}

}