DFS와 BFS는 대표적인 그래프 탐색 알고리즘
탐색

그래프와 트리의 깊은 부분을 우선적으로 탐색하는 알고리즘

graph는 인접 리스트 방식으로 저장되어 있다.visited를 True로 표시하며 탐색을 시작graph에 노드마다 연결된 노드들이 있으므로 for문으로 순회하며 방문하지 않은 노드들을 차례로 dfs를 재귀 호출하며 방문
public class DFSTest {
// DFS 메서드 정의
public static void dfs(List<List<Integer>> graph, int v, boolean[] visited) {
visited[v] = true;
System.out.print(v + " ");
for (int i : graph.get(v)) {
if (!visited[i]) {
dfs(graph, i, visited);
}
}
}
public static void main(String[] args) {
// 그래프 초기화 (인접 리스트 방식)
int n = 6; // 노드 개수 (예제에 맞게 설정)
List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i <= n; i++) { // 0번 인덱스는 사용 안 함
graph.add(new ArrayList<>());
}
// 그래프 연결 정보 추가 (예제용)
graph.get(1).add(2);
graph.get(1).add(3);
graph.get(2).add(4);
graph.get(2).add(5);
graph.get(3).add(6);
boolean[] visited = new boolean[n + 1]; // 방문 여부 체크 배열
// 재귀함수로 DFS 수행
dfs(graph, 1, visited);
}
}
💡결론
DFS는 차례대로 정렬된 노드를 방문하며 그 인접 노드들을 재귀적으로 방문하는 것이다.
가까운 노드부터 탐색하는 알고리즘

queue 자료구조를 이용하는 것이 일반적인데, 인접한 노드를 반복적으로 큐에 넣도록 알고리즘을 작성하면 자연스럽게 먼저 들어온 것이 먼저 나가게 되기 때문이다.queue에 삽입 -> 방문 처리queue 에서 노드를 꺼내고 그 노드의 인접노드 중 방문하지 않은 노드를 모두 queue 에 삽입 → 방문처리public class BFSTest {
// BFS 메서드 정의
public static void bfs(List<List<Integer>> graph, int start, boolean[] visited) {
Queue<Integer> queue = new LinkedList<>();
queue.add(start);
visited[start] = true;
while (!queue.isEmpty()) {
int v = queue.poll();
System.out.print(v + " ");
for (int i : graph.get(v)) {
if (!visited[i]) {
queue.add(i);
visited[i] = true;
}
}
}
}
public static void main(String[] args) {
int n = 6; // 노드 개수 (예제에 맞게 설정)
List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i <= n; i++) {
graph.add(new ArrayList<>());
}
// 그래프 연결 정보 추가 (예제용)
graph.get(1).add(2);
graph.get(1).add(3);
graph.get(2).add(4);
graph.get(2).add(5);
graph.get(3).add(6);
boolean[] visited = new boolean[n + 1];
// BFS 수행
bfs(graph, 1, visited);
}
}
💡결론
BFS는 차례대로 정렬된 노드를 큐에 넣고, 먼저 들어온 노드부터 순차적으로 방문하며 그 인접 노드들을 탐색하는 것이다.
| 알고리즘 | 시간 복잡도 (인접 리스트) | 시간 복잡도 (인접 행렬) | 공간 복잡도 |
|---|---|---|---|
| DFS | O(V+E) | O(V^2) | O(V) |
| BFS | O(V+E) | O(V^2) | O(V) |
그래프 알고리즘은 네트워크 분석, 경로 찾기 등 다양한 문제를 해결하는데 사용되는 중요한 알고리즘
그래프 구현 방법에는 인접 리스트를 사용하는 방법과 인접 행렬을 사용하는 방법이 있다.
💡따라서 인접 행렬은 그래프 간선이 많은 그래프에 주로 사용하고, 인접 리스트는 상대적으로 간선이 적은 그래프에서 주로 사용한다.
기본적인 그래프 탐색 알고리즘 종류에는 DFS(깊이 우선 탐색)와 BFS(너비 우선 탐색)이 있다.
대표적인 최단 경로 알고리즘에는 다익스트라 알고리즘, 벨만-포드 알고리즘, 플로이드 알고리즘 등이 있다.
대표적인 최소 신장 트리 알고리즘에는 크루스칼 알고리즘, 프림 알고리즘이 있다.