[algorithm] BFS / DFS

📝 1yangsh·2021년 4월 19일
0

algorithm

목록 보기
1/4

DFS/BFS

탐색(Search)이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정
대표적인 그래프 탐색 알고리즘으로 DFSBFS가 있다

Stack 자료구조

  • 먼저 들어온 데이터가 나중에 나가는 형식(선입후출)의 자료구조
  • 입구와 출구가 동일한 형태 (ex 프링글스 통)
## Stack
stack = []

stack.append(5)
stack.append(3)
stack.append(2)
stack.append(4)
stack.pop()
stack.append(7)

print(stack[::-1])

Queue 자료구조

  • 먼저 들어온 데이터가 먼저 나가는 형식(선입선출)의 자료구조이다
  • 큐는 입구와 출구가 모두 뚫려 있는 터널과 같은 형태
## Queue
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)

재귀 함수(Recursive Function)

  • 자기 자신을 다시 호출하는 함수

  • 예제) 유클리드 호제법

    • 두 자연수 A, B에 대하여 (A>B) A를 B로 나눈 나머지를 R이라고 하자
    • 이때 A와 B의 최대공약수는 B와 R의 최대공약수와 같다
## 유클리드 호제법을 재귀함수로 구현하여 최대공약수(GCD) 구하기
def gcd(a, b):
    if a % b == 0:
        return b
    else:
        return gcd(b, a % b)

print(gcd(192, 162))
# 재귀함수로 구현하는 팩토리얼
def factorial_recursive(n):
    if n <= 1:
        return 1
    return n * factorial_recursive(n - 1)

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

# 각 노드가 방문된 정보를 표현
visited = [False] * 9

# DFS
def dfs(graph, v, visitied):
    visited[v] = True
    print(v, end=' ')
    for i in graph[v]:
        if not visitied[i]:
            dfs(graph, i, visitied)

dfs(graph, 1, visited)
  • BFS는 너비 우선 탐색이라고도 부르며, 그래프에서 가까운 노드부터 우선적으로 탐색하는 알고리즘
  • BFS는 큐 자료구조를 이용하며, 구체적인 동작 과정은 다음과 같다
    1. 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다.
    2. 큐에서 노드를 꺼낸 뒤에 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리
    3. 더이상 2번의 과정을 수행할 수 없을 때까지 반복
## BFS
from collections import deque
graph = [
    [],
    [2, 3, 8], ## 1번 노드와 연결된 노드
    [1, 7],   ## 2번 노드와 연결된 노드
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]
# 각 노드가 방문된 정보를 표현
visited = [False] * 9

# BFS
def bfs(graph, start, visited):
    queue = deque([start])
    visited[start] = True

    while queue:
        v = queue.popleft()
        print(v, end=' ')
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True

bfs(graph, 1, visited)

Reference

[이코테 2021-DFS/BFS] - 동빈나

profile
개발 경험 저장소

0개의 댓글