루트 노드(또는 임의의 노드)에서 시작하여 다음 레벨로 이동하기 전에 같은 레벨의 이웃 노드를 먼저 탐색하는 그래프 순회 알고리즘으로
DFS 와 BFS 비교 그림 사진Queue(큐) 데이터 구조에 의존
큐는 노드 처리의 FIFO(선입선출) 순서를 유지하여 알고리즘의 너비 우선 특성을 유지
특징 | 너비 우선 탐색 (BFS) | 깊이 우선 탐색 (DFS) |
---|---|---|
탐색 순서 | 수평으로 레벨 단위 탐색 | 수직으로 최대한 깊게 이동하고 후진 |
구현 방식 | 일반적으로 큐(QUEUE) 사용 | 일반적으로 스택(STACK) 또는 재귀(RECURSION) 사용 |
시간복잡도 | 조건 내의 모든 노드를 탐색하기 때문에 시간복잡도는 동일 | |
메모리 사용 | 일반적으로 더 많은 메모리 사용 | 일반적으로 덜 많은 메모리 사용 |
경로 특성 |
|
|
import java.io.*;
import java.util.*;
public class Main {
static int N; // 시작 위치
static int K; // 목표 위치
static int visited[] = new int[100001]; // 방문한 노드를 기록하는 배열
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
String[] inputs = input.split(" ");
N = Integer.valueOf(inputs[0]);
K = Integer.valueOf(inputs[1]);
int result = bfs(N);
System.out.println(result);
}
private static int bfs(int node) {
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(node); // 시작 노드를 큐에 넣음
int index = node;
int n = 0;
visited[index] = 1; // 시작 노드를 방문했음을 표시하고 거리를 1로 설정
// 큐가 비어있을 때까지 BFS를 수행
while (queue.isEmpty() == false) {
n = queue.remove(); // 노드를 큐에서 꺼냄
if (n == K) {
// 현재 노드가 목표 노드인 경우 거리를 반환
return visited[n] - 1; // 시작 노드의 거리를 제외하기 위해 1을 뺌
}
// 인접한 노드들을 탐색
if (n - 1 >= 0 && visited[n - 1] == 0) {
visited[n - 1] = visited[n] + 1; // 왼쪽 인접 노드를 표시하고 큐에 넣음
queue.add(n - 1);
}
if (n + 1 <= 100000 && visited[n + 1] == 0) {
visited[n + 1] = visited[n] + 1; // 오른쪽 인접 노드를 표시하고 큐에 넣음
queue.add(n + 1);
}
if (2 * n <= 100000 && visited[2 * n] == 0) {
visited[2 * n] = visited[n] + 1; // 두 배의 인접 노드를 표시하고 큐에 넣음
queue.add(2 * n);
}
}
// 목표 노드에 도달하지 못하면 -1을 반환
return -1;
}
}