깊이 우선 탐색

  • 12 minutes to read

깊이 우선 탐색(Depth-First Search, DFS)은 그래프나 트리에서 노드를 방문하는 전략 중 하나로, 시작 노드에서 목표 노드를 찾을 때까지 가능한 한 깊게 탐색합니다. 이 방법은 노드의 모든 자식을 방문하기 전에 한 경로를 완전히 탐색합니다. 이 과정에서 방문한 노드를 기록하여 이미 방문한 노드를 다시 방문하지 않도록 합니다.

C# 언어에서 깊이 우선 탐색(Depth-First Search, DFS) 알고리즘을 구현하는 간단한 예제를 아래에 제공합니다. 이 예제에서는 인접 리스트를 사용하여 그래프를 표현하고 있습니다.

코드: DepthFirstSearchExample.cs

namespace VisualAcademy
{
    using System;
    using System.Collections.Generic;

    class Graph
    {
        private int numVertices; // 정점의 개수
        private List<int>[] adjList; // 인접 리스트를 사용한 그래프 표현

        // 생성자: 정점의 개수를 인자로 받아 초기화
        public Graph(int numVertices)
        {
            this.numVertices = numVertices;
            adjList = new List<int>[numVertices];
            for (int i = 0; i < numVertices; i++)
            {
                adjList[i] = new List<int>();
            }
        }

        // 간선 추가 메서드: 두 정점 u, v를 인자로 받아 간선을 추가
        public void AddEdge(int u, int v)
        {
            adjList[u].Add(v);
        }

        // 깊이 우선 탐색의 보조 메서드 (재귀적)
        private void DFSUtil(int vertex, bool[] visited)
        {
            visited[vertex] = true; // 정점을 방문한 것으로 표시
            Console.WriteLine("방문한 노드: " + vertex);

            // 인접한 정점들을 순회하며 방문하지 않은 정점에 대해 재귀 호출
            foreach (int adjacent in adjList[vertex])
            {
                if (!visited[adjacent])
                {
                    DFSUtil(adjacent, visited);
                }
            }
        }

        // 깊이 우선 탐색 메서드: 시작 정점을 인자로 받아 실행
        public void DFS(int startVertex)
        {
            bool[] visited = new bool[numVertices]; // 방문한 정점을 기록하는 배열
            DFSUtil(startVertex, visited); // 깊이 우선 탐색 실행
        }
    }

    class DepthFirstSearchExample
    {
        static void Main(string[] args)
        {
            Graph graph = new Graph(6); // 6개의 정점을 가진 그래프 객체 생성

            // 간선 추가
            graph.AddEdge(0, 1);
            graph.AddEdge(0, 2);
            graph.AddEdge(1, 3);
            graph.AddEdge(1, 4);
            graph.AddEdge(2, 4);
            graph.AddEdge(2, 5);

            graph.DFS(0); // 시작 정점을 0으로 설정하고 깊이 우선 탐색 실행
        }
    }
}
방문한 노드: 0
방문한 노드: 1
방문한 노드: 3
방문한 노드: 4
방문한 노드: 2
방문한 노드: 5

위 코드에서 Graph 클래스는 그래프를 표현하고, DFS 메서드를 사용하여 깊이 우선 탐색을 수행합니다. DFSUtil 메서드는 재귀적으로 깊이 우선 탐색을 구현하며, 방문한 노드를 visited 배열에 표시하여 이미 방문한 노드를 다시 방문하지 않습니다. Main 메서드에서 그래프를 생성하고 간선을 추가한 뒤, 시작 노드를 지정하여 깊이 우선 탐색을 수행합니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com