카테고리 없음

[알고리즘] DFS

미니시리 2024. 9. 8. 23:00

DFS는 깊이 우선 탐색이라고 부르며, 깊은 부분부터 우선적으로 탐색하는 알고리즘이다.
DFS는 Stack 자료구조 혹은 재귀 함수를 이용하여 구현할 수 있다.

 

4 5 1
1 2
1 3
1 4
2 4
3 4

 

DFS로 위 예제를 탐색하게 되면 1 2 4 3 이라는 결과를 얻을 수 있다.
해당 노드에서 갈 수 있는 방향을 기준으로 가장 작은 노드를 선택해서 방문 처리하며 진행한다.
이를 반복하여 끝까지 도달한다.

 

구현

Static

private static void DFS_Stack(int start) {
    Stack <Integer> stack = new Stack();
    stack.add(start);

    while(!stack.isEmpty()) {
        int node = stack.pop();

        if (!visited[node]) {
            System.out.print(node + " ");
            visited[node] = true;
        }

        for (int next : adjList.get(node)) {
            if (visited[next]) continue;
            stack.add(next);
        }
    }
}
  • 탐색 시작 노드를 스택에 삽입하고 아직 방문하지 않은 인접 노드를 탐색하여 스택에 추가한다.
  • 스택 내 최상단 노드를 꺼내 아직 방문하지 않은 인접 노드가 있다면 해당 노드를 스택에 넣고 방문 처리를 한다.
  • 인접한 노드가 하나도 없으면, 스택에서 최상단 노드를 꺼낸다.
  • 2, 3번 과정을 반복한다.

 

Recursion

private static void DFS_Recursion(int v) {
    if (!visited[v]) {
        System.out.print(v + " ");
        visited[v] = true;
    }

    for (int i = 0; i < adjList.get(v).size(); i++) {
        if (visited[adjList.get(v).get(i)]) continue;
        DFS_Recursion(adjList.get(v).get(i));
    }
}
  • 탐색 시작 노드를 메서드의 파라미터에 삽입하고 방문처리를 한다.
  • 아직 방문하지 않은 인접 노드가 있다면 해당 노드를 스택프레임에 넣고 방문 처리를 한다.
  • 인접한 노드가 하나도 없으면, 스택프레임에서 최상단 노드를 꺼낸다.
  • 2, 3번 과정을 반복한다.