Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- c#
- 스택영역
- MonoBehaviour
- rookiss
- 배열
- 스택
- 알고리즘
- 객체지향
- list
- vector
- map
- 반복문
- 인프런
- 벡터
- static_cast
- 차이점
- thread
- std::map
- 해쉬맵
- 자료구조
- 큐
- 기술면접
- 멀티쓰레드
- Queue
- 힙영역
- 프래그멘테이션
- std::unordered_map
- 트리
- 리스트
- 공부
Archives
- Today
- Total
호빵의 IT 개발소
[C#] DFS(깊이 우선 탐색) 본문
DFS란?
-Depth First Search의 약자로 깊이 우선 탐색이라고 불립니다. DFS를 예로 들어 용감한 전사 한명이 모든 보스 방을 클리어 하기위해 무조건 보이는 방을 직진해서 들어갑니다. 그러다가 길이 막히면 다시 다른 방을 찾기위해 되돌아와서 다른 방까지 클리어하게 됩니다. DFS는 스택 or 재귀함수로 구현하는데 대부분 재귀함수를 이용하여 구현합니다. 재귀함수를 이용할때에는 연결되어 있는지와 이미 방문했는지에 대한 여부를 꼭 프로그래밍 해주어야 합니다.
두가지 구현 방법을 예제로 작성해보겠습니다. (결과는 같습니다.)
1) 행렬을 이용한 DFS
2) List를 이용한 DFS
1) 행렬을 이용한 DFS
using System;
using System.Collections.Generic;
namespace Exercise
{
class Graph
{
int[,] adj = new int[6, 6]
{
{ 0, 1, 1, 0, 0, 0 },
{ 1, 0, 1, 0, 0, 0 },
{ 1, 1, 0, 1, 1, 0 },
{ 0, 1, 0, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 1 },
{ 0, 0, 0, 0, 1, 0 },
};
bool[] visited = new bool[6];
//1) 우선 now부터 방문
//2) now와 연결된 정점들을 하나씩 확인해서, 아직 미발견(미방문) 상태라면 방문한다.
public void DFS(int now)
{
Console.WriteLine(now);
visited[now] = true; //1) 우선 now 부터 방문
for (int next = 0; next < 6; next++)
{
if (adj[now, next] ==0) //연결되어 있지 않으면 스킵
continue;
if (visited[next]) //이미 방문 했으면 스킵
continue;
DFS(next);
}
}
}
class Program
{
static void Main(string[] args)
{
Graph graph = new Graph();
graph.DFS(0);
}
}
}
graph.DFS(0)일때


graph.DFS(1)일때


2) List를 이용한 DFS
using System;
using System.Collections.Generic;
namespace Exercise
{
class Graph
{
List<int>[] adj2 = new List<int>[]
{
new List<int>() { 1, 2 },
new List<int>() { 0, 2 },
new List<int>() { 0, 1, 3, 4 },
new List<int>() { 2 },
new List<int>() { 2, 5 },
new List<int>() { 4 }
};
bool[] visited = new bool[6];
public void DFS2(int now)
{
Console.WriteLine(now);
visited[now] = true; //1) 우선 now 부터 방문
foreach (int next in adj2[now]) //연결되어 있지 않으면 스킵
{
if (visited[next]) //이미 방문 했으면 스킵
continue;
DFS2(next);
}
}
}
class Program
{
static void Main(string[] args)
{
Graph graph = new Graph();
graph.DFS2(0);
}
}
}
---------------------------------------------------------------------------------------------------------------------------
참고 : [인프런] Rookiss님의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
'자료구조와 알고리즘 > 자료구조와 알고리즘 맛보기' 카테고리의 다른 글
| [C#] 다익스트라 최단 경로 알고리즘(추가 공부 필요) (0) | 2022.01.13 |
|---|---|
| [C#] BFS (너비 우선 탐색) (0) | 2022.01.13 |
| [C#] 그래프 이론 (0) | 2022.01.11 |
| [C#] 스택과 큐 (0) | 2022.01.11 |
| [C#] 연결 리스트 (0) | 2022.01.11 |
Comments