DFS/BFS

이승수·2022년 12월 27일

깊이 우선 탐색
그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘
스택 자료구조를 이용하여 구현

동작과정

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

소스코드

# DFS

# 재귀이기 때문에 재귀제한을 풀어줘야함
import sys
sys.setrecursionlimit(10000)
input = sys.stdin.readline		# 여러개의 input 받을때 시간 단축

# 방문 정보를 리스트 자료형으로 표현
visited = [False] * 9

# 각 노드가 연결된 정보를 리스트 자료형으로 표현 (2차원 리스트)
graph = [
	[],					# 1번 노드와 연결된 노드들
	[2, 3, 8],
	[1, 7],
	[1, 4, 5],
	[3, 5],
	[3, 4],
	[7],
	[2, 6, 8],
	[1, 7]
]

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

DFS(graph, 1, visited)1 2 7 6 8 3 4 5

너비 우선 탐색 이라고 부르며, 가까운 노드부터 탐색하는 알고리즘
가장 가까운 노드부터 우선 순위를 가져야 하기에, 큐(queue)를 이용하여 구현할 수 있다.
일반적으로 DFS보다 수행 시간이 좋은 편

동작과정

  1. 탐색 시작 노드를 큐에 삽입하고 방문 처리
  2. 큐에서 노드를 꺼내 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리
  3. 2번의 과정을 더 이상 수행할 수 없을 때까지 반복

소스코드

from collections import deque
# 방문 정보를 리스트 자료형으로 표현
visited = [False] * 9

# 각 노드가 연결된 정보를 리스트 자료형으로 표현 (2차원 리스트)
graph = [
	[],					# 1번 노드와 연결된 노드들
	[2, 3, 8],
	[1, 7],
	[1, 4, 5],
	[3, 5],
	[3, 4],
	[7],
	[2, 6, 8],
	[1, 7]
]
def BFS(graph, v, visited):
	queue = deque([v])
    
    # 현재 노드 방문 처리
    visited[v] = 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)1 2 3 8 7 4 5 6
profile
AI/Data Science

0개의 댓글