탐색(search) : 많은 양의 데이터중에서 원하는 데이터를 찾는 과정
-> 대표 유형 : DFS, BFS
필요한 자료구조
#스택 구현 예제
stack = []
stack.append(5)
stack.append(2)
stack.append(3)
stack.append(7)
stack.pop()
stack.append(1)
stack.append(4)
stack.pop
print(stack[::-1])
print(stack)
#큐 구현 예제
from collections import deque
queue = deque()
queue.append(5)
queue.append(2)
queue.append(3)
queue.append(7)
queue.popleft()
queue.append(1)
queue.append(4)
queue.popleft()
print(queue)
queue.reverse()
print(queue)
재귀 함수 (recursive funtion) : 자기 자신을 다시 호출하는 함수
컴퓨터가 함수를 연속적으로 호출하면 컴퓨터 메모리 내부의 스택 프레임에 쌓인다.
#재귀 함수 구현 예제
def recursive_function():
print('im recursive')
recursive_function()
recursive_function()
#팩토리얼 구현
#반복적으로 구현
def factorial_iterative(n):
result = 1
for i in range(1, n + 1):
result *= i
return result
#재귀적으로 구현
def factorial_recursive(n):
if n <= 1:
return 1
return n * factorial_recursive(n-1)
print(factorial_iterative())
print(factorial_recursive())
#DFS 구현 예제
def dfs(graph, v, visited):
#현재 노드 방문 처리
visited[v] = True
print(v, end=' ')
#현재 노드와 연결된 다른 노드를 재귀적으로 방문
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
#각 노드가 연결된 정보 표현(2차원 리스트)
graph = [[], [2, 3, 8], [1, 7], [1, 4, 5], [3, 5], [3, 4], [7], [2, 6, 8], [1, 7]]
#각 노드가 방문된 정보 표현(1차원 리스트)
visited = [False] * 9
# 정의된 DFS 함수 호출
dfs(graph, 1, visited)
#BFS 구현 예제
from collections import deque
def bfs(graph, start, visited):
#큐 구현
queue = deque([start])
#현재 노드 방문 처리
visited[start] = True
#큐가 빌 때 까지(false) 반복
while queue:
#한 개 원소 뽑아 출력
v = queue.popleft()
print(v, end=' ')
#현재 노드와 연결된 다른 노드를 재귀적으로 방문
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
#각 노드가 연결된 정보 표현(2차원 리스트)
graph = [[], [2, 3, 8], [1, 7], [1, 4, 5], [3, 5], [3, 4], [7], [2, 6, 8], [1, 7]]
#각 노드가 방문된 정보 표현(1차원 리스트)
visited = [False] * 9
# 정의된 BFS 함수 호출
bfs(graph, 1, visited)