written by sohyeon, hyemin ๐ก
๊น์ด ์ฐ์ ํ์(Depth First Search)์ ๋ฃจํธ ๋
ธ๋(ํน์ ๋ค๋ฅธ ์์์ ๋
ธ๋)์์ ์์ํด์ ๋ค์ ๋ถ๊ธฐ(branch)๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ํด๋น ๋ถ๊ธฐ๋ฅผ ์๋ฒฝํ๊ฒ ํ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
-
๋ฏธ๋ก๋ฅผ ํ์ํ ๋ ํ ๋ฐฉํฅ์ผ๋ก ๊ฐ ์ ์์ ๋๊น์ง ๊ณ์ ๊ฐ๋ค๊ฐ ๋ ์ด์ ๊ฐ ์ ์๊ฒ ๋๋ฉด ๋ค์ ๊ฐ๊น์ด ๊ฐ๋ฆผ๊ธธ๋ก ๋์์์ ์ด๊ณณ์ผ๋ก๋ถํฐ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๋ค์ ํ์์ ์งํํ๋ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํ๋ค.
-
๊ทธ๋ํ์์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ์ ํ ๋ ๋ ์ ํธ๋๋ ํธ์ด๋ค.
-
์ ์ ์ํ๋ฅผ ํฌํจํ ๋ค๋ฅธ ํํ์ ํธ๋ฆฌ ์ํ๋ ๋ชจ๋ ๊น์ด ์ฐ์ ํ์(DFS)์ ํ ์ข ๋ฅ์ด๋ค.
-
๊ทธ๋ํ ํ์์ ๊ฒฝ์ฐ
์ด๋ค ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์๋์ง ์ฌ๋ถ๋ฅผ ๋ฐ๋์ ๊ฒ์ฌํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.- ๊ฒ์ฌํ์ง ์์ ๊ฒฝ์ฐ ๋ฌดํ๋ฃจํ์ ๋น ์ง ์ํ์ด ์๋ค.
-
๊น์ด ์ฐ์ ํ์์ ์๊ธฐ ์์ ์ ๋ค์ ํธ์ถํ๋
์ํ ์๊ณ ๋ฆฌ์ฆ์ ํํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
1. ๊ทธ๋ํ์ ์์ ๋
ธ๋์์ ์ถ๋ฐํ์ฌ ๋จผ์ ์์ ๋
ธ๋ v๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ๋ฐฉ๋ฌธํ์๋ค๊ณ ํ์ํ๋ค.
2. v์ ์ธ์ ํ ๋
ธ๋๋ค ์ค์์ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋ u๋ฅผ ์ ํํ๋ค.
3. ๋ง์ฝ ๊ทธ๋ฌํ ๋
ธ๋๊ฐ ์๋ค๋ฉด ํ์์ ์ข
๋ฃํ๋ค.
4. ๋ง์ฝ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋ u๊ฐ ์๋ค๋ฉด u๋ฅผ ์์ ๋
ธ๋๋ก ํ์ฌ ๊น์ด ์ฐ์ ํ์์ ๋ค์ ์์ํ๋ค.
5. ์ด ํ์์ด ๋๋๊ฒ ๋๋ฉด ๋ค์ v์ ์ธ์ ํ ๋
ธ๋๋ค ์ค์์ ์์ง ๋ฐฉ๋ฌธ์ด ์ ๋ ๋
ธ๋๋ฅผ ์ฐพ๋๋ค.
6. ์์ ๊ฒฝ์ฐ ์ข
๋ฃํ๊ณ , ์๋ค๋ฉด ๋ค์ ๊ทธ ๋
ธ๋๋ฅผ ์์ ๋
ธ๋๋ก ํ์ฌ ๊น์ด ์ฐ์ ํ์์ ๋ค์ ์์ํ๋ค.
-
0๋ฒ ๋ ธ๋๋ฅผ ์์ ๋ ธ๋๋ก ์ ํํ๊ณ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ ์ฃผํฉ์์ผ๋ก ํ์ํ์๋ค.
-
์ ์ ํ์ดํ๋ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ก์ ๋ฐฉ๋ฌธ์ ์๋ํ๋ค๊ฐ ์คํจํ ๊ฐ์ ์ ์๋ฏธํ๊ณ , ์ค์ ํ์ดํ๋ ์ค์ ๋ก ๋ฐฉ๋ฌธํ๋ ๊ฐ์ ์ ์๋ฏธํ๋ค.
๊ตฌํ ๋ฐฉ๋ฒ์๋ ์ํ ํธ์ถ์ ์ด์ฉํ๋ ๊ฒ๊ณผ ๋ช
์์ ์ธ ์คํ์ ์ฌ์ฉํ๋ ๊ฒ(๋ฐฉ๋ฌธํ ๋
ธ๋๋ค์ ์คํ์ ์ ์ฅํ์๋ค๊ฐ ๋ค์ ๊บผ๋ด์ด ์์
ํ๋ ๊ฒ)์ด๋ค.
void search(Node root) {
if (root == null) return;
// root ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ค.
visit(root);
root.visited = true;
// root ๋
ธ๋์ ์ธ์ ํ ์ ์ ์ ๋ชจ๋ ๋ฐฉ๋ฌธํ๋ค.
for each (Node n in root.adjacent) {
// ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๊ฐ ์๋ค๋ฉด root ๋
ธ๋์ ์ธ์ ํ ์ ์ ์ ์ ์ ์์ ์ ์ ์ผ๋ก DFS๋ฅผ ์์
if (n.visited == false) {
search(n);
}
}
}
https://gmlwjd9405.github.io/2018/08/14/algorithm-dfs.html
import java.io.*;
import java.util.*;
// ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ๋ฐฉํฅ์ฑ ์๋ ๊ทธ๋ํ ํด๋์ค
class Graph {
private int V; // ๋
ธ๋์ ๊ฐ์
private LinkedList<Integer> adj[]; // ์ธ์ ๋ฆฌ์คํธ
// Constructor(์์ฑ์)
Graph(int v) {
V = v;
adj = new LinkedList[v];
for (int i=0; i<v; ++i)
adj[i] = new LinkedList();
}
// ๋
ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ค. (v->w)
void addEdge(int v, int w) {
adj[v].add(w); // Add w to v's list.
}
// DFS์ ์ํด ์ฌ์ฉ๋๋ ํจ์
void DFSUtil(int v,boolean visited[]) {
// ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๊ฒ์ผ๋ก ํ์ํ๊ณ ๊ฐ ์ถ๋ ฅํ๋ค.
visited[v] = true;
System.out.print(v+" ");
// ๋ฐฉ๋ฌธํ ๋
ธ๋์ ์ธ์ ํ ๋ชจ๋ ๋
ธ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
Iterator<Integer> i = adj[v].listIterator();
while (i.hasNext()) {
int n = i.next();
// ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ฉด ํด๋น ๋
ธ๋๋ฅผ ์์ ๋
ธ๋๋ก ํ๊ณ DFSUtil์ ํธ์ถํ๋ค.
if (!visited[n])
DFSUtil(n, visited);
}
}
// ์ฃผ์ด์ง ๋
ธ๋๋ฅผ ์์ ๋
ธ๋๋ก DFS๋ฅผ ํ์ํ๋ค.
void DFS(int v) {
// ๋
ธ๋์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค.
boolean visited[] = new boolean[V];
// v๋ฅผ ์์ ๋
ธ๋๋ก ํ์ฌ DFSUtil์ ์ํ ํธ์ถํ๋ค.
DFSUtil(v, visited);
}
// 2๋ฅผ ์์ ๋
ธ๋๋ก ํ์ฌ DFS๋ฅผ ํ์ํ๋ค.
public static void main(String args[]) {
Graph g = new Graph(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
g.DFS(2);
}
}
-
์ฝ๋ฉ์ธํฐ๋ทฐ ์์ ๋ถ์
-
C์ธ์ด๋ก ์ฝ๊ฒ ํ์ด์ด ์๋ฃ ๊ตฌ์กฐ
-
https://www.geeksforgeeks.org/depth-first-search-or-dfs-for-a-graph/

