문제
- 현수와 송아지의 위치가 주어질 때, 현수가 송아지의 위치로 갈 수 있는 최소의 점프 횟수를 구해라
- 현수는 한 번의 점프로 앞으로 1, 뒤로 1, 앞으로 5 이동 가능하다.
레벨 0에서 루트 노드를 큐에 넣어주고, 방문 체크를 해준다.
while문에서 큐의 사이즈를 구해준다. // 큐의 사이즈 = 레벨에 있는 원소의 개수
큐의 사이즈 만큼 for문을 돌려준다.
큐에서 원소들을 꺼내준다. // 레벨에 있는 원소들
원소들이 다음에 갈 수 있는 위치들을 계산해준다.
다음 위치의 원소들이 범위에서 벗어나지 않고, 방문하지 않았던 곳만 큐에 넣어준다.
이때, 다음 레벨의 원소가 송아지의 위치일 경우 현재레벨+1을 return 해준다.
없을 경우, for문이 종료되고 해당 레벨의 순회는 종료되어 레벨을 +1 증가 시켜준다.
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
int answer = 0;
int[] dis = {1, -1, 5};
int[] ch; // 체크 배열
Queue<Integer> Q = new LinkedList<>();
public int BFS(int s, int e){
ch = new int[10001]; // 좌표는 1부터 10000까지
ch[s] = 1; // 방문 체크
Q.offer(s); // root 노드
int L = 0; // 레벨 0에서 시작
while(!Q.isEmpty()){
int len = Q.size(); // 큐의 크기 = 레벨에 있는 원소
for(int i=0; i<len; i++){
int x = Q.poll(); // 레벨에 있는 노드 꺼내주기
//if(x==e) return L; // 송아지 찾는 방법 1 : 레벨에 송아지의 위치가 존재하면 return
for(int j=0; j<3; j++){ // 이동할 수 있는 3가지 경우의 수
int nx = x + dis[j]; // 현재노드 + 이동거리 = 이동한 노드의 위치
if(nx==e) return L+1; // 송아지 찾는 방법 2 : 다음 레벨에 송아지가 있다는 뜻
if(nx>=1 && nx<=10000 && ch[nx]==0){
// 범위에서 벗어나지 않고, 방문 체크 안한곳만
Q.offer(nx);
}
}
}
// for문 종료되면 레벨 증가
L++;
}
return 0;
}
public static void main(String[] args) {
Solution T = new Solution();
int s = 5;
int e = 14;
System.out.println(T.BFS(s, e));
}
}
'코딩테스트 > Java' 카테고리의 다른 글
[JAVA] DFS - 인접 행렬을 사용한 경로 탐색 (0) | 2022.06.29 |
---|---|
[JAVA] DFS, BFS - 루트 노드에서 말단 노드까지 가장 최단 경로 (0) | 2022.06.29 |
[JAVA] BFS - 이진트리레벨탐색 (0) | 2022.06.29 |
[JAVA] DFS - 부분 집합 구하기 (0) | 2022.06.29 |
[JAVA] DFS - 이진트리순회 (0) | 2022.06.29 |