코딩테스트
[인프런 자바/java] 8. 송아지 찾기 1(BFS : 상태트리탐색) _디버깅의 눈물
디버깅의 눈물
2022. 9. 7. 16:13
체크 포인트
1. BFS(너비 우선 탐색)를 이용하는 문제
-'점프의 최소 횟수'를 구하는 문제이기 때문에, 최단 경로를 구하는 BFS로 접근
2. 방문과 카운팅의 동시 처리
-새로운 위치(newX)로 이동 시, 이전의 방문 위치(map[temp])의 값에 점프 횟수 1을 추가
-어떤 map[]의 값이 0이 아닌 경우, 기존에 방문했음을 의미
-어떤 map[]의 값이 나타내는 숫자는 해당 지점까지 도달하기 위한 총 점프 횟수를 의미
// 새로운 map[newX]의 값은 이전보다 한번 점프 횟수 추가
map[newX] = map[temp] + 1;
풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
// 현수의 위치 S, 송아지의 위치 E
static int S, E;
// 현수가 송아지를 찾으러 다니는 수평선 상의 위치 배열
static int[] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
// 현수의 위치
S = Integer.parseInt(st.nextToken());
// 송아지의 위치
E = Integer.parseInt(st.nextToken());
// 지도 배열 초기화
map = new int[10001];
// 현수의 위치로부터 bfs 탐색 시작
bfs(S);
}
public static void bfs(int x){
// 문제에서 '최소의 점프 수'를 요구했으므로 Queue 사용
Queue<Integer> Q = new LinkedList<Integer>();
// 현수의 초기 위치값(현수의 위치 x = 5, 현수의 위치값 map[x] = 1)
// x=5일 때, map[5]=1로 처리하므로써 해당 위치를 방문했다고 표시
map[x] = 1;
Q.add(x);
while(!Q.isEmpty()){
// 큐로부터 꺼낸 이전 x값
int temp = Q.poll();
// 새롭게 탐색할 x값을 담는 변수 newX
int newX;
// 현수가 이동할 수 있는 방법에 따른 조건
for(int i=0; i<3; i++){
if(i==0){
newX = temp + 1;
}
else if(i==1){
newX = temp - 1;
}
else{
newX = temp + 5;
}
// 새로운 x값이 송아지의 위치와 같다면,
if(newX==E){
// 송아지를 찾는 동안 움직였던 총 거리 수 출력
System.out.println(map[temp]);
return;
}
// 새로운 x(newX)가 (0~10000) 사이에 존재하고,
// 이전에 방문한 적이 없는 위치라면 탐색!
if(newX>=0 && newX<map.length && map[newX]==0){
// 탐색할 newX를 큐에 넣어준다.
Q.add(newX);
// 새로운 map[newX]의 값은 이전보다 한번 점프 횟수 추가
map[newX] = map[temp] + 1;
}
}
}
}
}