📌 문제 설명
현수가 잃어버린 송아지를 찾기 위해 최소 점프 횟수를 구하는 문제이다.
현수는 한 번의 점프로 +1, -1, +5만큼 이동할 수 있고, 송아지는 움직이지 않는다.
두 위치가 주어졌을 때, 최소 점프 횟수를 출력한다.
📝 입력 & 출력
입력
- 첫 번째 줄에 두 정수 S와 E가 주어진다. (1 ≤ S, E ≤ 10,000)
S는 현수의 위치, E는 송아지의 위치
출력
- 현수가 송아지에게 도달하기 위한 최소 점프 횟수를 출력한다.
🔹 예제 입력 & 출력
예제 입력
5 14
예제 출력
3
- 이동 경로: 5 → 6 → 7 → 14
또는 5 → 10 → 9 → 14
💡 해결 방법
이 문제는 최단 거리를 구해야 하므로
DFS가 아닌 BFS(넓이우선탐색)를 사용해야 한다.
- 각 위치를 노드, 이동을 간선으로 생각할 수 있다.
- 현재 위치에서 다음 위치로 갈 수 있는 경우는 +1, -1, +5
- BFS를 이용해 가까운 위치부터 차례로 탐색하면 최소 횟수를 먼저 찾게 된다.
💻 코드 구현 (Java)
전체 코드
package partRecursiveTreeGraph;
import java.util.*;
public class Problem8 {
public int BFS(int s, int e) {
boolean[] ch = new boolean[10001];
int[] dis = {1, -1, 5};
Queue<Integer> Q = new LinkedList<>();
int L = 0;
Q.offer(s);
ch[s] = true;
while(!Q.isEmpty()) {
int len = Q.size();
for(int i=0; i<len; i++) {
int current = Q.poll();
for(int d: dis) {
int next = current + d;
if(next == e) return L+1;
if(next>=1 && next<=10000 && !ch[next]) {
ch[next] = true;
Q.offer(next);
}
}
}
L++;
}
return 0;
}
public static void main(String[] args) {
Problem8 T = new Problem8();
Scanner kb = new Scanner(System.in);
int s = kb.nextInt();
int e = kb.nextInt();
System.out.print(T.BFS(s, e));
kb.close();
}
}
📖 코드 설명
1️⃣ 이동 규칙 설정 & 방문 체크 배열
boolean[] ch = new boolean[10001];
int[] dis = {1, -1, 5};
- 현수가 이동할 수 있는 값들: +1, -1, +5
- ch[i] == true면 i 위치는 이미 방문한 위치 → 중복 탐색 방지
2️⃣ BFS를 위한 큐 초기화
Queue<Integer> Q = new LinkedList<>();
Q.offer(s);
ch[s] = true;
- 현수의 시작 위치를 큐에 넣고 방문 처리
3️⃣ BFS 실행: 레벨 단위 탐색
while(!Q.isEmpty()) {
int len = Q.size();
for(int i=0; i<len; i++) {
int current = Q.poll();
for(int d: dis) {
int next = current + d;
if(next == e) return L+1;
if(next>=1 && next<=10000 && !ch[next]) {
ch[next] = true;
Q.offer(next);
}
}
}
L++;
}
- 다음 위치가 송아지 위치면 → 현재 레벨 + 1 반환
- 1~10,000 범위를 벗어나지 않고 방문하지 않은 경우만 큐에 추가
⏳ 시간 복잡도 분석
- 현수가 이동 가능한 모든 위치 수는 최대 10,000개
- 각 위치에서 최대 3가지 이동을 시도
- 총 시간 복잡도: O(N) (N = 10,000 이하, BFS는 모든 노드를 1번씩 탐색)
🧠 핵심 정리
- BFS는 최단 거리 문제에 적합하다.
- 레벨 단위 탐색을 통해 몇 번 만에 송아지를 찾을 수 있는지 구한다.
- 중복 방문을 막기 위해 boolean[] 방문 배열을 사용한다.
- 시간 복잡도는 O(N)으로 매우 빠르다.
출처: 인프런 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
https://www.inflearn.com/course/자바-알고리즘-문제풀이-코테대비/dashboard
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의 | 김태원 - 인프런
김태원 | , 자바(Java) 알고리즘 문제풀이 채점사이트를 통해 기초부터 준비해보세요! 💪 [사진] 이 강의는 [사진] 자바(Java)로 코딩테스트 준비를 하고 계신 분께 추천드려요! 문제는 기초~ 중급
www.inflearn.com
'코딩테스트 > 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비' 카테고리의 다른 글
| 섹션 7 Recursive, Tree, Graph - 11. 경로탐색 (인접행렬) (0) | 2025.04.30 |
|---|---|
| 섹션 7 Recursive, Tree, Graph - 10. Tree 말단 노드까지의 가장 짧은 경로 (0) | 2025.04.30 |
| 섹션 7 Recursive, Tree, Graph - 7. 이진트리 순회(넓이우선탐색 : 레벨탐색) (1) | 2025.04.28 |
| 섹션 7 Recursive, Tree, Graph - 6. 부분집합 구하기(DFS) (0) | 2025.04.28 |
| 섹션 7 Recursive, Tree, Graph - 5. 이진트리 순회(깊이우선탐색) (0) | 2025.04.28 |