[알고리즘] 깊이 우선 탐색 알고리즘 (DFS, Depth-First Search)

·2023년 8월 15일
0

알고리즘

목록 보기
4/4
post-thumbnail

깊이 우선 탐색(DFS, Depth-First Search)

📌 그래프 탐색이란?

  • 그래프 탐색의 목적은 하나의 정점으로부터 시작하여 차례대로 모든 정점들을 한 번씩 방문하는 것이다.
  • 일반적인 그래프의 데이터는 정렬되어 있지 않다.
  • 그래프에서 원하는 데이터를 찾으려면, 하나씩 모두 방문해야 한다.

📌 깊이 우선 탐색(DFS)이란?

  • DFS는 깊이 우선 탐색이라고도 부르며 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘이다.
  • DFS는 스택 자료구조(혹은 재귀 함수) 를 이용하며, 구체적인 동작 과정은 다음과 같다.
    1. 탐색 시작 노드를 스택에 삽입하고 방문 처리를 한다.
    1. 스택의 최상단 노드에 방문하지 않은 인접한 노드가 하나라도 있으면 그 노드를 스택에 넣고 방문 처리한다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
    2. 더 이상 2번의 과정을 수행할 수 없을 때까지 반복한다.
  • 한 정점에서 시작해서 다음 경로로 넘어가기 전에 해당 경로를 완벽하게 탐색할 때 사용한다.

📌 깊이 우선 탐색(DFS)의 특징

  • 자기 자신을 호출하는 순환 알고리즘의 형태를 가지고 있다.
  • 전위 순위(Pre-Order Travaersals)를 포함한 다른 형태의 트리 순회는 모두 DFS의 한 종류이다.
  • DFS를 구현할 때 가장 큰 차이점은, 어떤 노드를 방문했었는지 여부를 반드시 검사 해야 한다. 그렇지 않으면 무한 루프에 빠질 수 있다.

📌 깊이 우선 탐색(DFS)의 과정








출처 : 동빈나 - (이코테 2021 강의 몰아보기) 3. DFS & BFS

📌 깊이 우선 탐색(DFS)의 구현 - Java

import java.util.*;

public class Main {

    public static boolean[] visited = new boolean[9];
    public static ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>();

    // DFS 함수 정의
    public static void dfs(int x) {
        // 현재 노드를 방문 처리
        visited[x] = true;
        System.out.print(x + " ");
        // 현재 노드와 연결된 다른 노드를 재귀적으로 방문
        for (int i = 0; i < graph.get(x).size(); i++) {
            int y = graph.get(x).get(i);
            if (!visited[y]) dfs(y);
        }
    }

    public static void main(String[] args) {
        // 그래프 초기화
        for (int i = 0; i < 9; i++) {
            graph.add(new ArrayList<Integer>());
        }

        // 노드 1에 연결된 노드 정보 저장 
        graph.get(1).add(2);
        graph.get(1).add(3);
        graph.get(1).add(8);
        
        // 노드 2에 연결된 노드 정보 저장 
        graph.get(2).add(1);
        graph.get(2).add(7);
        
        // 노드 3에 연결된 노드 정보 저장 
        graph.get(3).add(1);
        graph.get(3).add(4);
        graph.get(3).add(5);
        
        // 노드 4에 연결된 노드 정보 저장 
        graph.get(4).add(3);
        graph.get(4).add(5);
        
        // 노드 5에 연결된 노드 정보 저장 
        graph.get(5).add(3);
        graph.get(5).add(4);
        
        // 노드 6에 연결된 노드 정보 저장 
        graph.get(6).add(7);
        
        // 노드 7에 연결된 노드 정보 저장 
        graph.get(7).add(2);
        graph.get(7).add(6);
        graph.get(7).add(8);
        
        // 노드 8에 연결된 노드 정보 저장 
        graph.get(8).add(1);
        graph.get(8).add(7);

        dfs(1);
    }

}

출력 결과
1 2 7 6 8 3 4 5

참고 자료
heejeong Kwon - [알고리즘]깊이 우선 탐색(DFS)이란
하나몬 - [자료구조] 탐색 : BFS / DFS
동빈나 - (이코테 2021 강의 몰아보기) 3. DFS & BFS

profile
SOOP

0개의 댓글