DepthFirstSearch
Depth First Search
๊น์ด ์ฐ์ ํ์(Depth-First Search)
: ๋ฃจํธ ๋ ธ๋(ํน์ ๋ค๋ฅธ ์์์ ๋ ธ๋)์์ ์์ํด์ ๋ค์ ๋ถ๊ธฐ(branch)๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ํด๋น ๋ถ๊ธฐ๋ฅผ ์๋ฒฝํ๊ฒ ํ์ํ๋ ๋ฐฉ๋ฒ
๊น์ด ์ฐ์ ํ์(DFS)์ ํน์ง
์๊ธฐ ์์ ์ ํธ์ถํ๋ ์ํ ์๊ณ ๋ฆฌ์ฆ์ ํํ ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ ์ ์ํ(Pre-Order Traversals)๋ฅผ ํฌํจํ ๋ค๋ฅธ ํํ์ ํธ๋ฆฌ ์ํ๋ ๋ชจ๋ DFS์ ํ ์ข ๋ฅ์ด๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ๋ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์, ๊ทธ๋ํ ํ์์ ๊ฒฝ์ฐ ์ด๋ค ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์๋์ง ์ฌ๋ถ๋ฅผ ๋ฐ๋์ ๊ฒ์ฌ ํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ๊ฒ์ฌํ์ง ์์ ๊ฒฝ์ฐ ๋ฌดํ๋ฃจํ์ ๋น ์ง ์ํ์ด ์๋ค.

public class DFSGraph {
private int V; // ๋
ธ๋์ ๊ฐ์
private LinkedList<Integer> adj[]; // ์ธ์ ๋ฆฌ์คํธ
/* ์์ฑ์ */
public DFSGraph(int v) {
V = v;
adj = new LinkedList[v];
for (int i = 0; i < v; ++i) // ์ธ์ ๋ฆฌ์คํธ ์ด๊ธฐํ
adj[i] = new LinkedList();
}
/* ๋
ธ๋๋ฅผ ์ฐ๊ฒฐ */
void addEdge(int v, int w) {
adj[v].add(w);
}
/* 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);// ์ํ ํธ์ถ
}
}
void DFS(int v) {
// ๋
ธ๋์ ๋ฐฉ๋ฌธ ์ฌ๋ถ ํ๋จ
boolean visited[] = new boolean[V];
// ๋น์ฐ๊ฒฐํ ๊ทธ๋ํ์ ๊ฒฝ์ฐ, ๋ชจ๋ ์ ์ ์ ํ๋์ฉ ๋ฐฉ๋ฌธ
for (int i = 0; i < V ; ++i) {
if (visited[i] == false)
DFSUtil(i, visited);
}
}
public static void main(String args[]) {
DFSGraph g = new DFSGraph(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);
System.out.println("vertax 2์์ ์์ํ๋ DFS(๊น์ด ์ฐ์ ํ์)");
g.DFS(2); /* ์ฃผ์ด์ง ๋
ธ๋๋ฅผ ์์ ๋
ธ๋๋ก DFS ํ์ */
// 0 1 2 3
// g.DFS(); /* ๋น์ฐ๊ฒฐํ ๊ทธ๋ํ์ ๊ฒฝ์ฐ */
}
}
Last updated
Was this helpful?