Algorithm

Depth-First Search/Breadth-First Search

지미닝 2022. 7. 23. 23:32

DFS/BFS 는 그래프를 탐색하기 위한 대표적인 두 가지 알고리즘이다.


 탐색이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 의미한다. 프로그래밍에서는 그래프, 트리 등의 자료구조  안에서 탐색을 하는 문제를 자주 다룬다. 대표적인 탐색 알고리즘으로 DFS와 BFS가 있다. DFS와 BFS를 제대로 이해하려면 기본 자료구조인 스택과 큐에 대한 이해가 전제되어야 한다.

 

 자료구조란 '데이터를 표현하고 관리하고 처리하기 위한 구조'를 의미한다. 그중 스택과 큐는 자료구조의 기초 개념으로 다음의 두 핵심적인 함수로 구성된다.

  • 삽입(Push): 데이터를 삽입한다.
  • 삭제(Pop): 데이터를 삭제한다.

스택 (~=박스 쌓기)

스택은 선입후출(First In Last Out)구조 또는 후입선출(Last In First Out)구조이다. 파이썬에서 스택을 이용할 때에는 별도의 라이브러리를 사용할 필요 없이 기본 리스트에서 append()와 pop() 메서드를 이용하면 스택 자료구조와 동일하게 동작한다.


큐 (~=대기 줄)

큐는 선입선출(First In First Out)구조이다. 파이썬에서 큐를 구현할 때는 collections 모듈에서 제공하는 deque 자료구조를 활용한다. deque는 스택과 큐의 장점을 모두 채택한 것인데 데이터를 넣고 빼는 속도가 리스트 자료형에 비해 효율적이며 queue 라이브러리를 이용하는 것보다 더 간단하다.


재귀 함수

DFS와 BFS를 구현하려면 재귀 함수도 이해하고 있어야 한다. 재귀 함수란 자기자신을 다시 호출하는 함수를 의미한다. 컴퓨터 내부에서 재귀 함수의 수행은 스택 자료구조를 이용한다. 함수를 계속 호출했을 때 가장 마지막에 호출한 함수가 먼저 수행을 끝내야 그 앞의 함수 호출이 종료되기 때문이다. 


DFS

 DFS는 Depth-First Search, 깊이 우선 탐색이라고도 부르며, 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘이다. DFS를 알기 전에는 그래프의 기본 구조를 알아야 하는데, 그래프는 노드(Node)와 간선(Edge)로 표현되며 이때 노드를 정점(Vertex)라고도 말한다. 그래프 탐색이란 하나의 노드를 시작으로 다수의 노드를 방문하는 것을 말한다. 또한 두 노드가 간선으로 연결되어 있다면 '두 노드는 인접하다'라고 표현한다.

프로그래밍에서 그래프는 크게 2가지 방식으로 표현할 수 있다.

  • 인접 행렬(Adjacency Matrix): 2차원 배열로 그래프의 연결 관계를 표현하는 방식
  • 인접 리스트(Adjacency List): 리스트로 그래프의 연결 관계를 표현하는 방식

 이 알고리즘은 특정한 경로로 탐색하다가 특정한 상황에서 최대한 깊숙이 들어가서 노드를 방문한 후, 다시 돌아가 다른 경로로 탐색하는 알고리즘이다.

DFS는 스택 자료구조를 이용하여 구체적인 동작 과정은 다음과 같다.

  1. 탐색 시작 노드를 스택에 삽입하고 방문 처리를 한다.
  2. 스택의 최상단 노드에 방문하지 않은 인접 노드가 있으면 그 인접 노드를 스택에 넣고 방문처리를 한다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
  3. 2번의 괴정을 더 이상 수행할 수 없을때까지 반복한다.

Example_DFS.py


BFS

 BFS 알고리즘은 '너비 우선 탐색'이라는 의미를 가진다. 쉽게 말해 가까운 노드부터 탐색하는 알고리즘이다. DFS는 최대한 멀리 있는 노드를 우선적으로 탐색하는 방식으로 동작한다고 했는데, DFS는 그 반대다. BFS구현에서는 선입선출 방식인 큐 자료구조를 이용하는 것이 정석이다. 인접한 노드를 반복적으로 큐에 넣도록 알고리즘을 작성하면 자연스럽게 먼저 들어온 것이 먼저 나가게 되어, 가까운 노드부터 탐색을 진행하게 된다.

BFS 알고리즘의 정확한 동작 방식은 다음과 같다.

  1. 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다.
  2. 큐에서 노드를 꺼내 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문처리를 한다.
  3. 2번의 과정을 더 이상 수행할 수 없을 때까지 반복한다.

Example_BFS.py


정리표

  DFS BFS
동작 원리 스택
구현 방법 재귀 함수 이용 큐 자료구조 이용

+) 1차원 배열이나 2차원 배열을 그래프 형태로 생각하면 수월하게 문제를 풀 수 있다.

'Algorithm' 카테고리의 다른 글

[BOJ] 10872 팩토리얼 (C/C++)  (0) 2022.11.12
정렬 알고리즘(Sorting)  (0) 2022.08.06
파라메트릭 서치(Parametric Search)  (0) 2022.07.20
그리디[Greedy]  (0) 2022.07.20
이진 탐색[Binary Search]  (0) 2022.07.18