알고리즘 이론정리(스택, 큐, 재귀함수, DFS)

DFS / BFS

스택(Stack) : 박스 쌓기에 비유가능
선입후출(First In Last Out) / 후입선출(Last In First Out)

스택예제

stack = []

# 삽입(5) - 삽입(2) - 삽입(3) - 삽입(7) - 삭제() - 삽입(1) - 삽입(4) - 삭제()
stack.append(5)
stack.append(2)
stack.append(3)
stack.append(7)
stack.pop()
stack.append(1)
stack.append(4)
stack.pop()

print(stack) # 최하단 원소부터 출력
print(stack[::-1] # 최상단 원소부터 출력

큐(Queue) : 대기줄에 비유 가능
"공정한 자료구조" >> 선입선출(First In First Out)
Python에서 큐(Queue)를 구현할때는 Deque 자료구조 활용

큐 예제

from collections import deque

# 큐(Queue) 구현을 위해 deque 라이브러리 사용
queue = deque()

# 삽입(5) - 삽입(2) - 삽입(3) - 삽입(7) - 삭제() - 삽입(1) - 삽입(4) - 삭제()
queue.append(5)
queue.append(2)
queue.append(3)
queue.popleft()
queue.append(1)
queue.append(4)
queue.popleft()

print(queue) # 먼저 들어온 순서대로 출력
queue.reverse() # 다음 출력을 위해 역순으로 바꾸기
print(queue) # 나주엥 들어온 원소부터 출력

재귀 함수 : 자기 자신을 다시 호출하는 함수

재귀함수 예제

def recursive_function():
	print('재귀 함수를 호출합니다.')
    recursive_function()

recursive_function()

DFS (Depth-First-Search)의 정의

DFS는 (Depth-First-Search), 깊이 우선 탐색 이라고도 부르며,
그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘이다.

DFS의 구체적인 동작과정

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

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

DFS 예제

# 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)
1, 2, 7, 6, 8, 3, 4, 5

좋은 웹페이지 즐겨찾기