깊이 우선 탐색에 대한 개념은 아래의 포스팅을 참조하면 된다.
[알고리즘] 깊이 우선 탐색 (DFS, Depth-First Search)
이번 포스팅은 그래프를 탐색하는 알고리즘 중 하나인 깊이 우선 탐색(DFS)에 대해 알아보려고 한다. [자료구조] 그래프 (Graph)그래프라고 하면 원 그래프나 막대 그래프, 혹은 수학의 y=f(x) 그래
twd0622.tistory.com
깊이 우선 탐색을 코드로 구현하는 방법은 2가지로 반복 구현, 재귀 구현이 있다.
C#코드를 통해 DFS를 구현해 보겠다.
반복구현
반복 구현은 Stack을 이용한 구현 방법으로, 한 정점을 방문하면 인접한 정점들을 모두 Stack에 담고 Stack에서 하나씩 꺼내 인접한 노드를 Stack에 담으면서 Stack에 담긴 모든 노드를 방문할때 까지 반복하는 방법으로 구현한다.
// 인접 리스트를 이용한 방향성 있는 그래프
class Graph
{
private int vertex; // 정점
private List<int>[] adj; // adjacency, 그래프의 인접 목록
public Graph(int v)
{
vertex = v;
adj = new List<int>[v];
for (int i = 0; i < v; i++)
adj[i] = new List<int>();
}
// 간선 추가 (v → w)
public void addEdge(int v, int w)
{
adj[v].Add(w);
}
// DFS에 사용되는 함수
public void DFSUtill(int v, bool[] visited)
{
// 스택 생성
Stack<int> stack = new Stack<int>();
stack.Push(v);
while(stack.Count > 0)
{
int vt = stack.Pop();
// 방문 하고 출력
visited[vt] = true;
Console.Write(vt + " ");
// 인접 노드 담기
foreach(int neighbor in adj[vt])
{
if (!visited[neighbor])
stack.Push(neighbor);
}
}
}
// DFS 탐색
public void DFS()
{
bool[] visited = new bool[vertex];
// 모든 정점을 하나씩 방문
for (int i = 0; i < vertex; i++)
{
if (!visited[i])
DFSUtill(i, visited);
}
}
// 시작점v에서 DFS 탐색
public void DFS(int v)
{
// 노드 방문 여부
bool[] visited = new bool[vertex];
DFSUtill(v, visited);
}
}
static void Main(string[] args)
{
Graph g = new Graph(12);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(0, 3);
g.addEdge(1, 4);
g.addEdge(1, 5);
g.addEdge(2, 6);
g.addEdge(3, 7);
g.addEdge(3, 8);
g.addEdge(4, 9);
g.addEdge(6, 10);
g.addEdge(8, 11);
g.DFS(3); // 3 8 11 7
g.DFS(); // 0 3 8 11 7 2 6 10 1 5 4 9
}
재귀구현
재귀 구현은 재귀 함수를 이용한 구현법으로, 현재 정점에서 인접한 정점들 중 방문하지 않은 정점들을 DFS함수를 적용한다. 재귀 귀현은 모든 노드를 방문할 때 유리한 구현법이다.
// 인접 리스트를 이용한 방향성 있는 그래프
class Graph
{
private int vertex; // 정점
private List<int>[] adj; // adjacency, 그래프의 인접 목록
public Graph(int v)
{
vertex = v;
adj = new List<int>[v];
for (int i = 0; i < v; i++)
adj[i] = new List<int>();
}
// 간선 추가 (v → w)
public void addEdge(int v, int w)
{
adj[v].Add(w);
}
// DFS에 사용되는 함수
public void DFSUtill(int v, bool[] visited)
{
// 방문 하고 출력
visited[v] = true;
Console.Write(v + " ");
foreach (int neighbor in adj[v])
{
if (!visited[neighbor])
DFSUtill(neighbor, visited);
}
}
// DFS 탐색
public void DFS()
{
bool[] visited = new bool[vertex];
// 모든 정점을 하나씩 방문
for (int i = 0; i < vertex; i++)
{
if (!visited[i])
DFSUtill(i, visited);
}
}
// 시작점v에서 DFS 탐색
public void DFS(int v)
{
// 노드 방문 여부
bool[] visited = new bool[vertex];
DFSUtill(v, visited);
}
}
static void Main(string[] args)
{
Graph g = new Graph(12);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(0, 3);
g.addEdge(1, 4);
g.addEdge(1, 5);
g.addEdge(2, 6);
g.addEdge(3, 7);
g.addEdge(3, 8);
g.addEdge(4, 9);
g.addEdge(6, 10);
g.addEdge(8, 11);
g.DFS(3); // 3 7 8 11
g.DFS(); // 0 1 4 9 5 2 6 10 3 7 8 11
}
관련 문제
[C#][프로그래머스] 타겟 넘버
프로그래머스 > 코딩테스트 연습 > 깊이/너비 우선 탐색(DFS/BFS) > 타겟 넘버 https://school.programmers.co.kr/learn/courses/30/lessons/43165 📒 문제n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서
twd0622.tistory.com
[C#][프로그래머스] 무인도 여행
프로그래머스 > 코딩테스트 연습 > 연습문제 > 무인도 여행 https://school.programmers.co.kr/learn/courses/30/lessons/154540 📒 문제메리는 여름을 맞아 무인도로 여행을 가기 위해 지도를 보고 있습
twd0622.tistory.com
참고 사이트
'알고리즘' 카테고리의 다른 글
[알고리즘] 너비 우선 탐색, BFS(Breadth-First Search) 코드 구현 (0) | 2025.02.17 |
---|---|
[알고리즘] 구현 (Implementation) (1) | 2025.02.11 |
[알고리즘] 누적합 (Prefix Sum) (0) | 2025.02.10 |
[알고리즘] A* (에이 스타) 알고리즘 (1) | 2025.02.07 |
[알고리즘] 다익스트라 알고리즘 (Dijkstra Algorithm) (1) | 2025.02.06 |