탐색(Search) : 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정
이를 이해하기 위해서는 기본 자료구조인 스택과 큐에 대한 이해가 전제되어야 함!!
자료구조(Data Structure) : 데이터를 표현하고 관리하고 처리하기 위한 구조
stack = []
stack.append(5)
# [5]
stack.append(2)
# [5, 2]
stack.append(3)
# [5, 2, 3]
stack.append(7)
# [5, 2, 3, 7]
stack.pop()
# [5, 2, 3]
stack.append(1)
# [5, 2, 3, 1]
stack.append(4)
# [5, 2, 3, 1, 4]
stack.pop()
# [5, 2, 3, 1]
from collections import deque
q = deque()
q.append(5)
# [5]
q.append(2)
# [5, 2]
q.append(3)
# [5, 2, 3]
q.append(7)
# [5, 2, 3, 7]
q.popleft()
# [2, 3, 7]
q.append(1)
# [2, 3, 7, 1]
q.append(4)
# [2, 3, 7, 1, 4]
q.popleft()
# [3, 7, 1, 4]
재귀 함수 : 자기 자신을 다시 호출하는 함수
def recursive_function():
print('재귀 함수를 호출합니다.')
recursive_function()
recursive_function()
# 인접 행렬 예제
INF = 999999999
graph = [[0, 7, 5],
[7, 0, INF],
[5, INF, 0]]
# 행이 3개인 2차원 리스트
graph = [[] for _ in range(3)]
# 노드 0 연결 관계
graph[0].append((1, 7))
graph[0].apeend((2, 5))
# 노드 1 연결 관계
graph[1].append((0, 7))
# 노드 2 연결 관계
graph[2].apeend((0, 5))
그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘
1 - 2 - 7 - 6 - 8 - 3 - 4 - 5 순서로 탐색
스택을 이용하여 구현
# DFS 메서드 정의
def dfs(graph, n, visited):
# 현재 노드 방문 처리
visited[n] = True
print(n, end=' ')
# 현재 노드와 연결된 다른 노드들을 재귀적으로 방문
for i in graph[n]:
# 방문하지 않은 노드라면
if not visited[i]:
# 방문 처리
dfs(graph, i, visited)
# 노드 연결 정보를 리스트로 표현
graph = [
[], # 0번 노드는 없으므로..
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
# 현재 아무것도 방문하지 않은 상태이므로
visited = [False] * 9
# 정의된 함수 호출
dfs(graph, 1, visited)
가까운 노드부터 탐색하는 알고리즘
1 - 2 - 3 - 8 - 7 - 4 - 5 - 6 순서로 탐색
큐를 이용하여 구현
일반적으로 DFS 보다 수행 시간이 좋은 편
from collections import deque
# BFS 메서드 정의
def bfs(graph, start, visited):
queue = deque([start])
# 현재 노드 방문 처리
visited[start] = True
# 큐가 빌 때까지 반복
while queue:
# 제일 먼저 방문한 노드 꺼냄
n = queue.popleft()
print(n, end=' ')
# 해당 노드와 연결되고 아직 방문하지 않는 노드에 대해 반복
for i in graph[n]:
if not visited[i]:
queue.append(i)
visitied[i] = True
graph = [
[], # 0번 노드는 없으므로..
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
# 현재 아무것도 방문하지 않은 상태이므로
visited = [False] * 9
# 정의된 함수 호출
bfs(graph, 1, visited)
DFS | BFS | |
---|---|---|
동작 원리 | 스택 | 큐 |
구현 방법 | 재귀 함수 이용 | 큐 자료구조 이용 |