๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ ์ข ๋ฅ์ ํ์ฉ ๋ฐฉ๋ฒ
๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ ์ข ๋ฅ์ ํ์ฉ ๋ฐฉ๋ฒ ๊ด๋ จ
๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ(Graph Algorithms)์ ๋คํธ์ํฌ ๋ถ์, ๊ฒฝ๋ก ์ฐพ๊ธฐ, ์ต์ ํ ๋ฌธ์ ๋ฑ ๋ค์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ค์ํ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์ด๋ฒ ๊ธ์์๋ ๊ทธ๋ํ์ ๊ดํ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ๊ตฌํ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ณ , ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ ์ค ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋๋น ์ฐ์ ํ์(BFS), ๊น์ด ์ฐ์ ํ์(DFS)์ ์๋ ๋ฐฉ์์ ์์๋ณด๊ฒ ์ต๋๋ค. ๋ํ ์ด๋ค ๋ถ์ผ์์ ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ ์ ์๋์ง๋ ํจ๊ป ์ ๋ฆฌํด ๋ณด์์ต๋๋ค.
๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ ๊ฐ์
1) ๊ทธ๋ํ์ ๊ธฐ๋ณธ ๊ฐ๋
๊ทธ๋ํ๋ ์ ์ (Vertex, ๋๋ ๋ ธ๋(Node)๋ผ๊ณ ๋ ํจ)๊ณผ ์ด๋ค์ ์ฐ๊ฒฐํ๋ ๊ฐ์ (Edge)์ผ๋ก ๊ตฌ์ฑ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋งํฉ๋๋ค. ๋ฐฉํฅ์ฑ์ด ์๋ ๋ฐฉํฅ ๊ทธ๋ํ(Directed Graph)์ ๋ฐฉํฅ์ฑ์ด ์๋ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ(Undirected Graph)๋ก ๋๋๋ฉฐ, ๊ฐ์ ์ ๊ฐ์ค์น(Weight)๊ฐ ์์ ์๋ ์์ต๋๋ค. ์ด๋ฌํ ๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐ๋ ์ปดํจํฐ ๋คํธ์ํฌ, ๊ตํต ์์คํ , ์์ ๋ฏธ๋์ด์ ๊ฐ์ ๋ค์ํ ํ์ค ์ธ๊ณ์ ๋ฌธ์ ๋ฅผ ๋ชจ๋ธ๋งํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐ
2) ๊ทธ๋ํ ๊ตฌํ ๋ฐฉ๋ฒ
๊ทธ๋ํ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ธ์ ๋ฆฌ์คํธ(Adjacency List)์ ์ธ์ ํ๋ ฌ(Adjacency Matrix)์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ธ์ ๋ฆฌ์คํธ๋ ๊ฐ ์ ์ ์ ๋ํด ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ ์ ์ ๋ฆฌ์คํธ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก, ํน์ ์ ์ ๊ณผ ์ธ์ ํ ์ ์ ๋ค์ ๋ฐ๋ก ์ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ฐ๋ฉด ์ธ์ ํ๋ ฌ์ 2์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๋ ธ๋ ๊ฐ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ํ๋ ฌ ํํ๋ก ๋ํ๋ด๋ ๋ฐฉ์์ ๋๋ค. ๋ ธ๋ ๊ฐ์ ์ฐ๊ฒฐ ์ฌ๋ถ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ง๋ง, ๋ชจ๋ ๊ฐ ์ ์ ์ ๊ดํ ๊ด๊ณ๋ฅผ ๊ธฐ๋กํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ๋ ํฌ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ธ์ ํ๋ ฌ์ ๊ทธ๋ํ ๊ฐ์ ์ด ๋ง์ ๊ทธ๋ํ์ ์ฃผ๋ก ์ฌ์ฉํ๊ณ , ์ธ์ ๋ฆฌ์คํธ๋ ์๋์ ์ผ๋ก ๊ฐ์ ์ด ์ ์ ๊ทธ๋ํ์์ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ ์ข ๋ฅ
1) ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ
๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ(Graph Search Algorithms)์ ๊ทธ๋ํ์์ ํน์ ์ ์ ์ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋งํฉ๋๋ค. ์ด๋ ๊ฒ ๊ทธ๋ํ ๋ด ํน์ ์ ์ ์ ์ฐพ๊ธฐ ์ํด์๋ ๊ทธ๋ํ์ ๊ฐ ์ ์ ์ ์ํํ๋ฉด์ ๋ฐฉ๋ฌธํด์ผ ํ๋ฏ๋ก, ๊ทธ๋ํ ์ํ ์๊ณ ๋ฆฌ์ฆ(Graph Traversal Algorithms)์ผ๋ก ๋ถ๋ฅด๊ธฐ๋ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ธ ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ ์ข ๋ฅ๋ก๋ ๋๋น ์ฐ์ ํ์(BFS)๊ณผ ๊น์ด ์ฐ์ ํ์(DFS)์ด ์์ต๋๋ค.
2) ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์์ ๋ ์ ์ ๊ฐ์ ์ต์ ๊ฐ์ค์น ํฉ์ ๊ฐ์ง๋ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋งํฉ๋๋ค. ๋ํ์ ์ธ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ผ๋ก๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ(Dijkstra Algorithm), ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ(Bellman-Ford Algorithm), ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ(Floyd Algorithm) ๋ฑ์ด ์์ผ๋ฉฐ, ๋คํธ์ํฌ ์ค๊ณ, ๊ตํต ์์คํ ์ต์ ํ, ์ง๋ฆฌ์ ๊ฒฝ๋ก ํ์ ๋ฑ ๋ค์ํ ๋ถ์ผ์์ ๊ฒฝ๋ก ์ต์ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํ์ฉ๋ฉ๋๋ค.
3) ๊ทธ ๋ฐ์ ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ
๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์๋ ๊ทธ๋ํ ํ์๊ณผ ์ต๋จ ๊ฒฝ๋ก ์ฐพ๊ธฐ ์ธ์๋ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ด ์์ต๋๋ค. ๊ทธ์ค ํ๋์ธ ์์ ์ ๋ ฌ(Topological Sorting) ์๊ณ ๋ฆฌ์ฆ์ ๋ฐฉํฅ์ฑ์ด ์๋ ๊ทธ๋ํ์์ ๊ฐ ์ ์ ์ ์ ํ ๊ด๊ณ์ ๋ฐ๋ผ ๋์ดํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์ด๋ ์ฃผ๋ก ์์กด์ฑ์ด ์๋ ์ฌ๋ฌ ์์ ์ ์์๋๋ก ์ ๋ ฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ํ๋ก์ ํธ ์ค์ผ์ค๋ง์ด๋ ์ปดํ์ผ๋ฌ์ ์์ ์์ ๊ฒฐ์ ๋ฑ์ ํ์ฉ๋๊ณ ์์ต๋๋ค.
์ด ๋ฐ์๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ์ ์ต์ํ์ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐํ๋ ๋ถ๋ถ ๊ทธ๋ํ๋ฅผ ์ฐพ๋ **์ต์ ์ ์ฅ ํธ๋ฆฌ(Minimum Spanning Tree)**์๊ณ ๋ฆฌ์ฆ๋ ์์ต๋๋ค. ์ต์ ์ ์ฅ ํธ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ๋คํธ์ํฌ ์ค๊ณ, ํด๋ฌ์คํฐ๋ง, ๋ฌผ๋ฆฌ์ ์ธํ๋ผ ๊ณํ ๋ฑ์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๋ํ์ ์ธ ์ต์ ์ ์ฅ ํธ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก๋ ํฌ๋ฃจ์ค์นผ(Kruskal) ์๊ณ ๋ฆฌ์ฆ๊ณผ ํ๋ฆผ(Prim) ์๊ณ ๋ฆฌ์ฆ์ด ์์ต๋๋ค.
๋๋น ์ฐ์ ํ์๊ณผ ๊น์ด ์ฐ์ ํ์ ๋น๊ต
1) BFS ์๋ ๋ฐฉ์
์ด๋ฒ์๋ ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ ์ค์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋๋น ์ฐ์ ํ์(BFS, Breath-First Search)๊ณผ ๊น์ด ์ฐ์ ํ์(DFS, Depth-First Search) ์๊ณ ๋ฆฌ์ฆ์ ์๋ ๋ฐฉ์๊ณผ ์ฅ๋จ์ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ BFS๋ ๊ทธ๋ํ ํ์ ์ ๊ฐ๊น์ด ์ธ์ ์ ์ ์ ๋ชจ๋ ๋ฐฉ๋ฌธํ ํ, ๊ทธ๋ค์ ๊ฐ๊น์ด ์ธ์ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ ๋ฐฉ์์ ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๋งํฉ๋๋ค.
์์ ๊ฐ์ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์์ ๊ฐ์ ๋ ๋ฒจ์ธ ๊ฒฝ์ฐ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์ ๋, BFS๋ ์ ์ 1๋ฒ๋ถํฐ ์์ํด์ ์ธ์ ํ ์ ์ ๋ค์ ๋ชจ๋ ๋ฐฉ๋ฌธํ๊ณ ๋ค์ ์ฐจ๋ก์ ์ ์ ์ ๋ํด ์ธ์ ํ ์ ์ ์ค ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ ์์ผ๋ก ํ์์ด ์งํ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ ๊ทธ๋ํ์ BFS ํ์์ 1๋ฒ์ ์ธ์ ํ ๊ฐ์ ๋ ๋ฒจ์ ์ ์ ์ธ 2, 3, 8๋ฒ์ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ฐฉ๋ฌธํ๋ฉด์ ์์ํฉ๋๋ค. ๋ค์์ผ๋ก 2๋ฒ ์ ์ ์ ์ธ์ ํ๋ฉด์ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ธ 6๋ฒ ์ ์ ์ ๋ฐฉ๋ฌธํ๊ณ , ๋ค์์ผ๋ก 3๋ฒ ์ ์ ์ ์ธ์ ํ๋ฉด์ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ธ 4, 5๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ฐฉ๋ฌธํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก 6๋ฒ ์ ์ ๊ณผ ์ธ์ ํ 7๋ฒ ์ ์ ์ ๋ฐฉ๋ฌธํ๊ณ ํ์์ด ์ข ๋ฃ๋ฉ๋๋ค.
์ด์ BFS๋ฅผ ๊ตฌํํ ์๋ฐ ์ฝ๋ ์์๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
.BFS.java
BFS
ํด๋์ค์๋ ๊ทธ๋ํ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ์ธ์ ๋ฆฌ์คํธ์ ์ ์ ๊ณผ ๊ฐ์ ์ ์ถ๊ฐํ ์ ์๋ ๋ฉ์๋๊ฐ ์์ต๋๋ค.
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
import java.util.Set;
import java.util.HashSet;
public class BFS {
// BFS ํ์์ ์ํ ์ธ์ ๋ฆฌ์คํธ
private final Map<Integer, List<Integer>> graph;
// ์์ฑ์, ์ธ์ ๋ฆฌ์คํธ ์ด๊ธฐํ
public BFS() {
graph = new HashMap<>();
}
// ์ ์ ์ถ๊ฐ
public void addVertex(int vertex) {
graph.put(vertex, new ArrayList<>());
}
// ๊ฐ์ ์ถ๊ฐ
public void addEdge(int source, int destination) {
if (!graph.containsKey(source)) {
addVertex(source);
}
if (!graph.containsKey(destination)) {
addVertex(destination);
}
graph.get(source).add(destination);
}
// ... ์๋ต ...
}
๋ค์์ผ๋ก ์ ์ ์ ์ถ(FIFO) ์๋ฃ ๊ตฌ์กฐ์ธ ํ(Queue) ๋ฅผ ์ฌ์ฉํ์ฌ BFS ๋ฉ์๋๋ฅผ ์์ฑํฉ๋๋ค. ์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ BFS ๋ฉ์๋์์๋ ๋ฐฉ๋ฌธํ ์ ์ ์ ์ธ์ ์ ์ ๋ถํฐ ์ฐจ๋ก๋๋ก ์ํํ๋ฉด์ ํ์์ ์งํํฉ๋๋ค.
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
import java.util.Set;
import java.util.HashSet;
public class BFS {
// ... ์๋ต ...
// BFS ํ์
public void bfs(int source) {
Queue<Integer> queue = new LinkedList<>();
Set<Integer> visited = new HashSet<>();
queue.offer(source);
visited.add(source);
while(!queue.isEmpty()) {
int current = queue.poll();
System.out.print(current + " ");
for (Integer neighbor : graph.get(current)) {
if (!visited.contains(neighbor)) {
queue.offer(neighbor);
visited.add(neighbor);
}
}
}
}
// ... ์๋ต ...
}
๋ค์ ์ฝ๋๋ ๊ทธ๋ํ๋ฅผ ์ถ๋ ฅํ๊ณ , ์ค์ ๋ก BFS๊ฐ ์ด๋ป๊ฒ ํ์์ ์งํํ๋์ง ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ํ ์คํธ ์ฝ๋์ ๋๋ค.
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
import java.util.Set;
import java.util.HashSet;
public class BFS {
// ... ์๋ต ...
// ๊ทธ๋ํ ์ถ๋ ฅ
public void printGraph() {
for (Integer vertex : graph.keySet()) {
System.out.print(vertex + " -> ");
for (Integer neighbor : graph.get(vertex)) {
System.out.print(neighbor + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
BFS bfs = new BFS();
bfs.addEdge(1, 2);
bfs.addEdge(1, 3);
bfs.addEdge(1, 8);
bfs.addEdge(2, 6);
bfs.addEdge(2, 8);
bfs.addEdge(3, 4);
bfs.addEdge(3, 5);
bfs.addEdge(4, 5);
bfs.addEdge(6, 7);
bfs.printGraph();
System.out.println("BFS: start from vertex 1");
bfs.bfs(1);
}
}
์์ ์ดํด๋ณธ ์์ ๊ทธ๋ํ์ ๋ํด BFS๋ฅผ ์ํํ๋ฉด 1 > 2 > 3 > 8 > 6 > 4 > 5 > 7
๋ก ํ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
java -cp ./BFS.class
#
# BFS ํ
์คํธ ๊ฒฐ๊ณผ
# 1 -> 2 3 8
# 2 -> 6 8
# 3 -> 4 5
# 4 -> 5
# 5
# 6 -> 7
# 7 ->
# 8 ->
# BFS: start from vertex 1
# 1 2 3 8 6 4 5 7
2) DFS ์๋ ๋ฐฉ์
DFS๋ ์ถ๋ฐ ์ ์ ์์ ์ต๋ํ ๊น์ด ๊ฐ ์ ์๋ ์ ์ ๊น์ง ๊ฐ๋ณด๊ณ , ๋ ์ด์ ์งํ ๋ชปํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ๋ค์ ๋์์์(Back Tracking) ๊ฐ๋ฆผ๊ธธ์ ์๋ ๋ฏธ๋ฐฉ๋ฌธ ์ ์ ๋ถํฐ ํ์์ ์์ํ๋ ๋ฐฉ์์ ๋งํฉ๋๋ค.
์ ๊ทธ๋ํ์์ DFS๋ฅผ ํ๋ฉด ์ถ๋ฐ ์ ์ 1๋ฒ๋ถํฐ ์์ํ์ฌ 2 > 6 > 7๋ฒ ์์ผ๋ก ํ์์ ์งํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง๋ค๋ฅธ ๊ธธ์ธ 7๋ฒ์์ ๋ค์ ๋ค๋ก ๋์์์, ๊ฐ๋ฆผ๊ธธ์ด ์๋ 2๋ฒ ์ ์ ์์ ๋ค์ 8๋ฒ์ผ๋ก ๋ด๋ ค๊ฐ๋ ๋ฐฉ์์ผ๋ก ์งํ๋ฉ๋๋ค. ์ด์ ๊ฐ์ DFS๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ ์๋ฃ ๊ตฌ์กฐ๋ก ์คํ(Stack)์ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ๊ท ํธ์ถ ๋ฐฉ์(Recursion)์ ์ด์ฉํฉ๋๋ค.
๋ค์ ์ฝ๋๋ ์ฌ๊ท ํธ์ถ์ ์ด์ฉํ DFS ๊ตฌํ ์ฝ๋ ์์์ ๋๋ค.
.DFS.java
์ด์ ์ BFS ์์ ์ฝ๋์ ๊ฐ์ด ๋จผ์ DFS ํด๋์ค ๋ด์ ๊ทธ๋ํ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๊ณ , ์ ์ ๊ณผ ๊ฐ์ ์ ์ถ๊ฐํ ์ ์๋ ๋ฉ์๋๋ฅผ ๋ง๋ญ๋๋ค.
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.Collections;
public class DFS {
// DFS ํ์์ ์ํ ์ธ์ ๋ฆฌ์คํธ
private final Map<Integer, List<Integer>> graph;
// ์์ฑ์, ์ธ์ ๋ฆฌ์คํธ ์ด๊ธฐํ
public DFS() {
graph = new HashMap<>();
}
// ์ ์ ์ถ๊ฐ
public void addVertex(int vertex) {
graph.put(vertex, new ArrayList<>());
}
// ๊ฐ์ ์ถ๊ฐ
public void addEdge(int source, int destination) {
if (!graph.containsKey(source)) {
addVertex(source);
}
if (!graph.containsKey(destination)) {
addVertex(destination);
}
graph.get(source).add(destination);
}
// ... ์๋ต ...
}
DFS๋ ์คํ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ง๋ค ์๋ ์์ง๋ง, ์ฌ๊ธฐ์๋ ์ฌ๊ท ํธ์ถ์ ์ด์ฉ ํ์ฌ ๊ตฌํํ์ต๋๋ค. DFS ๋ฉ์๋์์๋ ์ ์ ์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๊ณ , ์ฌ๊ท ํธ์ถ ๋ฉ์๋์ธ dfsRecursive ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. dfsRecursive ๋ฉ์๋์์๋ ๋ฒํธ๊ฐ ๋ฎ์ ์์๋ก ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋์ง ์์ ์ ์ ์ด ๋์ฌ ๋๊น์ง ์ฌ๊ท ํธ์ถ์ ํ๋ ๋ฐฉ์์ผ๋ก ํ์์ ์งํํฉ๋๋ค.
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.Collections;
public class DFS {
// ... ์๋ต ...
// DFS ํ์
public List<Integer> dfs(int source) {
List<Integer> visited = new ArrayList<>();
dfsRecursive(source, visited);
return visited;
}
// DFS ์ฌ๊ท ๋ฉ์๋
private void dfsRecursive(int node, List<Integer> visited) {
visited.add(node);
// ์ ๋ ฌํ์ฌ ๋
ธ๋ ๋ฒํธ๊ฐ ๋ฎ์ ์์๋ถํฐ ๋ฐฉ๋ฌธ
Collections.sort(graph.get(node));
for (int neighbor : graph.get(node)) {
if (!visited.contains(neighbor)) {
dfsRecursive(neighbour, visited); // ์ฌ๊ท ํธ์ถ
}
}
}
// ... ์๋ต ...
}
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.Collections;
public class DFS {
// ... ์๋ต ...
// ๊ทธ๋ํ ์ถ๋ ฅ
public void printGraph() {
for (Integer vertex : graph.keySet()) {
System.out.print(vertex + " -> ");
for (Integer neighbor : graph.get(vertex)) {
System.out.print(neighbor + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
DFS dfs = new DFS();
dfs.addEdge(1, 2);
dfs.addEdge(1, 3);
dfs.addEdge(1, 8);
dfs.addEdge(2, 6);
dfs.addEdge(2, 8);
dfs.addEdge(3, 4);
dfs.addEdge(3, 5);
dfs.addEdge(4, 5);
dfs.addEdge(6, 7);
dfs.printGraph();
System.out.println("DFS: start from vertex 1");
List<Integer> dfsResult = dfs.dfs(1);
System.out.println("DFS ํ์ ์์: " + dfsResult);
}
}
๋ง์ง๋ง์ผ๋ก ๊ทธ๋ํ๋ฅผ ์ถ๋ ฅํ๊ณ , DFS๊ฐ ์ด๋ป๊ฒ ํ์์ ์งํํ๋์ง ์ดํด๋ณด์ฃ . ์๋ ํ
์คํธ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์์ ์ดํด๋ณธ ์์ ๊ทธ๋ํ์ฒ๋ผ 1 > 2 > 6 > 7 > 8 > 3 > 4 > 5
๋ก ํ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
java -cp ./DFS.class
#
# 1 -> 2 3 8
# 2 -> 6 8
# 3 -> 4 5
# 4 -> 5
# 5
# 6 -> 7
# 7 ->
# 8 ->
# DFS: start from vertex 1
# DFS ํ์ ์์: [1, 2, 6,7, 8, 3, 4, 5]
3) ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋น๊ต ๋ฐ ์ฅ๋จ์
๋ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ ๊ทธ๋ํ์ ๊ตฌ์กฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ผ๋, ์ผ๋ฐ์ ์ผ๋ก ๋ก ํํ๋ฉ๋๋ค. ์ฌ๊ธฐ์ V๋ ์ ์ ์ ๊ฐ์๋ฅผ ๋งํ๋ฉฐ, E๋ ๊ฐ์ ์ ๊ฐ์๋ฅผ ๋งํฉ๋๋ค.
๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฅ๋จ์ ์ ์ดํด๋ณด๋ฉด ์ฐ์ BFS๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฐ ์ ์ฉํ์ง๋ง, ๋์ ๋ฒ์๋ฅผ ํ์ํ ๋ ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ํฌ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
๋ฐ๋ฉด DFS๋ ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ์ ๊ณ ๋ณต์กํ ๊ฒฝ๋ก๋ ์ฌ์ดํด์ ์ฐพ๋ ๋ฐ ์ ๋ฆฌํ์ง๋ง, ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. ์ด๋ฌํ ์ฅ๋จ์ ์ ๋ฐ๋ผ BFS๋ ์ฃผ๋ก ๋คํธ์ํฌ ๋ผ์ฐํ , ์์ ๋คํธ์ํน์ ์ต๋จ ๊ฒฝ๋ก ์ฐพ๊ธฐ ๋ฑ์ ์ฌ์ฉ๋๊ณ , DFS๋ ํผ์ฆ, ๋ฏธ๋ก ์ฐพ๊ธฐ, ํธ๋ฆฌ ๊ตฌ์กฐ ๋ถ์ ๋ฑ์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ ํ์ฉ ๋ฐฉ๋ฒ
1) ์ปดํจํฐ ๋คํธ์ํน์์์ ํ์ฉ
๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ปดํจํฐ ๋คํธ์ํน ๋ถ์ผ์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ํนํ ๋คํธ์ํฌ ๋ด์์์ ๋ฐ์ดํฐ ํจํท ์ ์ก ๊ฒฝ๋ก๋ฅผ ์ต์ ํํ๊ธฐ ์ํด ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉ๋๋๋ฐ์. ์๋ฅผ ๋ค์ด, ๋ผ์ฐํฐ์ ์ค์์น๋ BFS ๋๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ ์ก ๊ฒฝ๋ก๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
2) ์์ ๋คํธ์ํฌ ๋ฐ ์จ๋ผ์ธ ๋ถ์ผ์์์ ํ์ฉ
๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ์์ ๋คํธ์ํฌ ๋ถ์์์ ์ฌ์ฉ์ ๊ฐ์ ๊ด๊ณ ๋ฐ ์ปค๋ฎค๋ํฐ ๊ตฌ์กฐ๋ฅผ ํ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๊ธฐ๋ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, BFS์ DFS๋ฅผ ์ด์ฉํ์ฌ ์น๊ตฌ ์ถ์ฒ ์์คํ ์ด๋ ์์ ๋คํธ์ํฌ ๋ด์์์ ์ํฅ๋ ฅ ์๋ ์ฌ์ฉ์๋ฅผ ์๋ณํ๊ธฐ๋ ํฉ๋๋ค. ๋ํ ์จ๋ผ์ธ ํ๋ซํผ์์ ์น ํ์ด์ง ๋ญํน, ํค์๋ ํด๋ฌ์คํฐ๋ง, ์ฐ๊ฒฐ ๋คํธ์ํฌ ๋ถ์ ๋ฑ์๋ ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์ด ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
3) ์ธ๊ณต์ง๋ฅ ๋ฐ ๋จธ์ ๋ฌ๋์์์ ํ์ฉ
๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ์ธ๊ณต์ง๋ฅ(AI)๊ณผ ๋จธ์ ๋ฌ๋(ML) ๋ถ์ผ์์๋ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ธ๊ณต ์ง๋ฅ๊ณผ ๊ด๋ จํ์ฌ ๊ฒฝ๋ก ํ์, ํผ์ฆ ํด๊ฒฐ, ์ด๋ฏธ์ง ํ๋ก์ธ์ฑ ๋ฐ ์์ฌ ๊ฒฐ์ ๊ณผ์ ์์ ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์ด ํ์ฉ๋๋ฉฐ, ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์์ ๋ฐ์ดํฐ์ ๋ณต์กํ ๊ด๊ณ๋ฅผ ํ์ ํ๊ณ ๋ถ๋ฅํ๋ ๋ฐ ์ฌ์ฉ๋๊ธฐ๋ ํฉ๋๋ค. ํนํ ์ง์ ๊ทธ๋ํ์ ์ถ์ฒ ์์คํ , ์์ฐ์ด ์ฒ๋ฆฌ(NLP) ๋ฑ์ ๋ณต์กํ ๋ฐ์ดํฐ ์งํฉ ๊ฐ์ ์จ๊ฒจ์ง ํจํด๊ณผ ์ฐ๊ฒฐ์ฑ์ ํ์ํ๊ณ , ๋์ฑ ์ ํํ ์์ธก ๋ชจ๋ธ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์ฉ๋ฉ๋๋ค.
๋ง์น๋ฉฐ
์ง๊ธ๊น์ง ๊ทธ๋ํ์ ๊ฐ๋ ๊ณผ ๊ตฌํ ๋ฐฉ๋ฒ, ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ์ด์ธ BFS, DFS์ ์๋ ๋ฐฉ์๊ณผ ํ์ฉ ๋ฐฉ๋ฒ์ ์ดํด๋ดค์ต๋๋ค. ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ํ ๋ถ์ผ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํ์ฉ๋๊ณ ์์ผ๋ฉฐ, ํนํ ์ธ๊ณต์ง๋ฅ๊ณผ ๋จธ์ ๋ฌ๋ ๋ถ์ผ์์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. ํด๋น ๋ถ์ผ์ ๊ด์ฌ์ด ์๋ค๋ฉด ๋ฏธ๋ฆฌ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ ํ์ตํด ๋๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.