반응형
깊이 우선 탐색(DFS, Depth-First Search)
특정 노드에서 시작하여 그래프를 탐색하면서 제일 깊은 곳으로 들어갔다가 더 이상 들어갈 곳이 없게 되면 다시 돌아와 다른 경로로 탐색을 진행한다. 이를 통해 모든 노드를 방문하고자 할때 사용할 수 있는 탐색 알고리즘이다.
1. 행렬
01 그래프 행렬로 표현
int[,] adj = new int[10, 10]
{
{0,1,0,0,0,0,0,1,0,0 },
{1,0,1,0,1,0,0,0,0,0 },
{0,1,0,1,0,0,0,0,0,0 },
{0,0,1,0,0,0,0,0,0,0 },
{0,1,0,0,0,1,1,1,0,0 },
{0,0,0,0,1,0,0,0,0,0 },
{0,0,0,0,1,0,0,0,0,0 },
{1,0,0,0,1,0,0,0,1,0 },
{0,0,0,0,0,0,0,1,0,1 },
{0,0,0,0,0,0,0,0,1,0 },
};
02 노드의 방문 상태 기록
bool[] visited = new bool[10];
03 DFS 알고리즘 구현
public void DFS(int now)
{
Console.WriteLine(now);
visited[now] = true;
for(int next = 0; next < 10; next++)
{
if (adj[now, next] == 0)
continue;
if (visited[next])
continue;
DFS(next);
}
}
주요 단계 설명
1) 현재 방문한 노드 출력 및 visited에 표시
Console.WriteLine(now);
visited[now] = true;
2) 현재 노드 now와 연결된 모든 노드에대한 반복문
for(int next = 0; next < 10; next++)
{
}
3) 현재 노드 now와 다음 노드 next사이에 연결 여부를 확인한다.
만약 값이 0이면 연결이 없으므로 다음 노드로 이동한다.
if (adj[now, next] == 0)
continue;
4) 방문하였는지 여부 확인
만약 이미 방문한 노드라면 다음 노드로 이동
if (visited[next])
continue;
5) 위의 두 조건을 만족하지 않은 경우 다음 노드 방문
DFS(next);
재귀 원리 설명
2. 리스트
01 그래프 리스트로 표현
List<int>[] adj2 = new List<int>[]
{
new List<int>() {1,7},
new List<int>() {0,2,4},
new List<int>() {1,3},
new List<int>() {2},
new List<int>() {1,5,6},
new List<int>() {4},
new List<int>() {4},
new List<int>() {0,4,8},
new List<int>() {7,9},
new List<int>() {8},
};
02 DFS 알고리즘 구현
설명은 위와 같음
public void DFS2(int now)
{
Console.WriteLine(now);
visited[now] = true;
foreach(int next in adj2[now])
{
if (visited[next])
continue;
DFS2(next);
}
}
3. 모든 노드를 방문하면서 노드간의 연결성 탐색
public void SerachAll()
{
visited = new bool[10];
for (int now = 0; now < 10; now++)
if (visited[now] == false)
{
Console.WriteLine(now);
DFS2(now);
}
}
7이 이어져있지 않다고 가정하자
01 now가 0일때 0 - 6을 방문하고
02 7이 되었을때 7-9를 방문하면서 모두 방문하게 된다.
참고 : 본 내용은 MMORPG PART2 강의를 수강하여 작성하였습니다.
반응형
'코딩테스트 준비 > 자료구조 & 알고리즘' 카테고리의 다른 글
C# - 다이나믹 프로그래밍(DP) (0) | 2023.10.08 |
---|---|
C# - BFS(너비우선탐색)개념 및 코드 구현 (0) | 2023.09.19 |
C# - 연결리스트 구현 (0) | 2023.09.04 |
C# - 문자열로 이루어진 리스트 요소들을 정수로 바꾸는법 +) 지연 평가(Lazy Evaluation) (0) | 2023.09.01 |
C# - IEnumerable설명 및 메서드(MIN,MAX,Average등) (0) | 2023.08.28 |
댓글