- 탐색(Search)이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 말한다.
- 대표적인 그래프 탐색 알고리즘으로는 DFS와 BFS가 있다.
- DFS/BFS는 코딩 테스트에서 매우 자주 등장하는 유형이므로 반드시 숙지해야 한다.
- 스택(Stack) : 선입후출
리스트의 append()와 pop() 메서드를 이용해 구현한다.
- 큐(Queue) : 선입선출
리스트로 구현할 수 있지만 시간 복잡도 때문에 비효율적이기 때문에 collections 라이브러리의 deque를 사용한다.
append()를 통해 삽입, popleft()를 통해 삭제한다.
- 재귀함수(Recursive Function) : 자기 자신을 다시 호출하는 함수
- 재귀 함수를 문제 풀이에서 사용할 때는 재귀 함수의 종료 조건을 반드시 명시해야 한다.
- 종료 조건을 제대로 명시하지 않으면 함수가 무한히 호출될 수 있다.
- 모든 재귀 함수는 반복문을 이용하여 동일한 기능을 구현할 수 있다.
- 재귀 함수가 반복문보다 유리한 경우도 있고 불리한 경우도 있다.
- 컴퓨터가 함수를 연속적으로 호출하면 컴퓨터 메모리 내부의 스택 프레임에 쌓인다. 그래서 스택을 사용해야 할 때 구현상 스택 라이브러리 대신에 재귀 함수를 이용하는 경우가 많다.

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


- 1번 노드부터 시작하는 경우가 많아서, index[0]인 곳은 비워두고, [1]인 곳부터 연결 정보를 입력한다.
- 각 노드가 방문된 정보를 표현하는 visited를 만들 때도 [0]은 사용하지 않기 때문에 이를 고려해 [False] * 9 (하나 더 큰 크기로 리스트를 초기화 해준다.)
BFS (Breadth First Search, 너비 우선 탐색)
- 그래프에서 가까운 노드부터 우선적으로 탐색하는 알고리즘이다.
- 큐 자료구조를 이용하며, 구체적인 동작 과정은 다음과 같다.
- 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다.
- 큐에서 노드를 꺼낸 뒤에 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리한다.
- 더 이상 2번의 과정을 수행할 수 없을 때까지 반복한다.


개발자 노씨 강의 코드
너비 우선 탐색 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')
'알고리즘' 카테고리의 다른 글
Dynamic Programming vs Dijkstra's Algorithm (1) | 2025.02.22 |
---|---|
[Python] 순열(permutation), 조합(combination) 구현 (1) | 2022.10.15 |
큐(queue) (0) | 2022.03.27 |
[선형 자료구조] 스택, 큐 (0) | 2022.03.11 |
[선형 자료구조] 해시 테이블 (0) | 2022.03.11 |