알고리즘

[그래프 탐색 알고리즘] DFS/BFS

  • 탐색(Search)이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 말한다.
  • 대표적인 그래프 탐색 알고리즘으로는 DFS와 BFS가 있다.
  • DFS/BFS는 코딩 테스트에서 매우 자주 등장하는 유형이므로 반드시 숙지해야 한다.

- 스택(Stack) : 선입후출

리스트의 append()와 pop() 메서드를 이용해 구현한다. 

 

- 큐(Queue) : 선입선출

리스트로 구현할 수 있지만 시간 복잡도 때문에 비효율적이기 때문에 collections 라이브러리의 deque를 사용한다.

append()를 통해 삽입, popleft()를 통해 삭제한다. 

 

- 재귀함수(Recursive Function) : 자기 자신을 다시 호출하는 함수

  • 재귀 함수를 문제 풀이에서 사용할 때는 재귀 함수의 종료 조건을 반드시 명시해야 한다.
  • 종료 조건을 제대로 명시하지 않으면 함수가 무한히 호출될 수 있다.
  • 모든 재귀 함수는 반복문을 이용하여 동일한 기능을 구현할 수 있다.
  • 재귀 함수가 반복문보다 유리한 경우도 있고 불리한 경우도 있다.
  •  컴퓨터가 함수를 연속적으로 호출하면 컴퓨터 메모리 내부의 스택 프레임에 쌓인다. 그래서 스택을 사용해야 할 때 구현상 스택 라이브러리 대신에 재귀 함수를 이용하는 경우가 많다.

종료 조건을 포함한 재귀 함수 예제


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

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

DFS

  • 1번 노드부터 시작하는 경우가 많아서, index[0]인 곳은 비워두고, [1]인 곳부터 연결 정보를 입력한다.
  • 각 노드가 방문된 정보를 표현하는 visited를 만들 때도 [0]은 사용하지 않기 때문에 이를 고려해 [False] * 9 (하나 더 큰 크기로 리스트를 초기화 해준다.)

 

BFS (Breadth First Search, 너비 우선 탐색)

  • 그래프에서 가까운 노드부터 우선적으로 탐색하는 알고리즘이다.
  • 큐 자료구조를 이용하며, 구체적인 동작 과정은 다음과 같다.
    1. 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다.
    2. 큐에서 노드를 꺼낸 뒤에 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리한다.
    3. 더 이상 2번의 과정을 수행할 수 없을 때까지 반복한다. 

BFS

 


개발자 노씨 강의 코드

너비 우선 탐색 BFS - Queue 사용

# BFS
from collections import deque

def bfs(graph, start_v):
	visited = [start_v]
    queue = deque(start_v)
    while queue:
    	cur_v = queue.popleft()
        for v in graph[cur_v]:
        	if v not in visited:
            	visited.append(v)
            	queue.append(v)
    return visited

bfs(graph, 'A')

 

깊이 우선 탐색 DFS - 재귀 사용

# DFS
graph = {
    'A': ['B', 'D', 'E'],
    'B': ['A', 'C', 'D'],
    'C': ['B'],
    'D': ['A', 'B'],
    'E': ['A']
}
visited = []


def dfs(cur_v):
    visited.append(cur_v)
    for v in graph[cur_v]:
        if v not in visited:
            dfs(v)


dfs('A')

'알고리즘' 카테고리의 다른 글

[Python] 순열(permutation), 조합(combination) 구현  (1) 2022.10.15
큐(queue)  (0) 2022.03.27
[선형 자료구조] 스택, 큐  (0) 2022.03.11
[선형 자료구조] 해시 테이블  (0) 2022.03.11