하나씩 알아가기

DFS와 BFS 파이썬 코드 본문

알고리즘

DFS와 BFS 파이썬 코드

clearwater 2021. 1. 27. 02:09
728x90
반응형

DFS(Depth-First-Search, 깊이 우선 탐색)

그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘입니다.

 

동작 과정

① 탐색 시작 노드를 스택에 삽입하고 방문처리를 한다.

② 스택의 최상단 노드에 방문하지 않은 인접 노드가 있으면 그 인접 노드를 스택에 넣고 방문 처리를 한다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다

②번의 과정을 더 이상 수행할 수 없을 때까지 반복한다.

 

※ 동작 원리는 스택이지만 구현은 재귀 함수를 이용해서 하는 것이 더 간결합니다.

def dfs(graph, v, visited):
    #현재 노드를 방문처리
    visited[v] = True
    print(v, end=' ')
    #현재 노드와 연결된 다른 노드를 재귀적으로 방문
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)

BFS(Breadth-First-Search, 너비 우선 탐색)

가까운 노드부터 탐색하는 알고리즘입니다.

 

동작 과정

① 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다.

② 큐에서 노드를 꺼내 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리를 한다.

②번의 과정을 더 이상 수행할 수 없을 때까지 반복한다.

 

파이썬으로  큐를 구현할 때 collections의 deque 라이브러리를 사용할 수 있습니다. deque에서는 리스트 자료형과 다르게 인덱싱, 슬라이싱 등의 기능은 사용할 수 없지만, 연속적으로 나열된 데이터의 시작 부분이나 끝부분에 데이터를 삽입하거나 삭제할 때는 매우 효과적으로 사용될 수 있습니다.

from collections import deque

def bfs(graph, start, visited):
    #큐 구현을 위해 deque 라이브러리 사용
    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

DFS와 BFS 기본 코드는 완벽하게 반복&습득하여, 자다가도 일어나서 생각할 수 있을만큼 떠올릴 수 있도록 하겠습니다. 그래야 다른 DFS와 BFS 관련 문제가 나왔을 때 수월하게 대응할 수 있다고 생각합니다.

 

정리

  DFS BFS
동작 원리 스택
구현 방법 재귀 함수 이용 큐 자료구조 이용

 

참고 및 출처

이것이 취업을 위한 코딩테스트다 [나동빈]

728x90
반응형

'알고리즘' 카테고리의 다른 글

[BOJ_1699] 제곱수의 합  (0) 2021.02.01
[BOJ_1260] DFS와 BFS  (0) 2021.01.27
[BOJ_2193] 이친수  (0) 2021.01.25
[BOJ_3085] 사탕 게임  (0) 2021.01.24
[BOJ_1476] 날짜 계산  (0) 2021.01.24