알고리즘

[java] 백준 1697:숨바꼭질

_DAMI 2023. 4. 11. 19:33

https://www.acmicpc.net/problem/1697

 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

처음에 dfs로 접근하려다가 안되겠어서 답지를 보니 bfs로 푸는 거였다. 최단시간 거리를 구하는건 bfs인데 dfs만 하다보니 순간 까먹었다...(경험부족으로 더 공부해야겠다)

 

 

 

 

완성된 코드

import java.util.*;

public class Main {

	public static int[] visited = new int[100001];
	public static int n,m;
	
	public static void BFS(int n) {
		Queue<Integer> q = new LinkedList<>();
		q.add(n);
		visited[n] = 1;
		
		while(!q.isEmpty()) {
			int now = q.poll();
			
				for(int i=0; i<3; i++) {
					int next;
					if(i==0) 
						next = now-1;
					else if(i==1) 
						next = now+1;
					else
						next = now*2;
				
				if(next==m) {
					System.out.println(visited[now]);
					return;}
				
				if(0<=next && next<100001&&visited[next]==0 ) {
					q.add(next);
					visited[next]=visited[now]+1;
				}
				
				}
		}}
		


	public static void main(String[] args) {
	
		Scanner kb = new Scanner(System.in);
		n=kb.nextInt();
		m=kb.nextInt();
		if(n==m) { System.out.println(0);}
		else {BFS(n);}
		
		
	}


}

 

 

 

백준 런타임 에러 이유

계속해서 런타임 에러가 나서 진짜 한시간동안 삽질한거 같다....... 원인은

	if(visited[next]==0 && 0<=next && next<100001 ) {
					q.add(next);
					visited[next]=visited[now]+1;
				}

if문 안에 조건의 순서였다 vistied[next]==0을 뒷 순서로 넣으니 됐다 이유는 뭐지..?? 잘 모르겠다..

아마도 0인 경우가 많아서 시간을 많이 잡아먹는건가? 

에러 잡으려고 노력한 흔적... 나 진짜 집착광공인듯