DFS와 BFS

미미·2023년 4월 6일
0

algorithm

목록 보기
1/7
post-thumbnail

DFS

깊이 우선 탐색이라고 부르며 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘
-> 스택 자료구조(혹은 재귀 함수) 이용

👀 동작 과정

(과정을 보여주기 위한 예시에서 노드는 1번부터 탐색은 숫자가 낮은 노드부터 하는 것으로 가정한다.)

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

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

인접한 노드 2, 3, 8이 존재하며 그중 숫자가 낮은 2번 노드를 스택에 넣고 방문처리한다. -> 최상단 노드가 2로 변경


최상단 노드 2와 인접한 노드 7을 스택에 넣고 방문처리한다. -> 최상단 노드가 7로 변경


최상단 노드 7와 인접한 노드 6을 스택에 넣고 방문처리한다. -> 최상단 노드가 6로 변경

최상단 노드 6와 인접한 노드 중 방문하지 않은 노드가 없으므로 최상단 노드를 스택에서 꺼낸다.-> 최상단 노드가 7로 변경

최상단 노드 7와 인접한 노드 8을 스택에 넣고 방문처리한다. -> 최상단 노드가 8로 변경

... 위와 같은 과정을 계속 반복한다.

최상단 노드 8와 인접한 노드 중 방문하지 않은 노드가 없으므로 최상단 노드를 스택에서 꺼낸다.-> 최상단 노드가 7로 변경
최상단 노드 7와 인접한 노드 중 방문하지 않은 노드가 없으므로 최상단 노드를 스택에서 꺼낸다.-> 최상단 노드가 2로 변경
최상단 노드 2와 인접한 노드 중 방문하지 않은 노드가 없으므로 최상단 노드를 스택에서 꺼낸다.-> 최상단 노드가 1로 변경
최상단 노드 1와 인접한 노드 3을 스택에 넣고 방문처리한다. -> 최상단 노드가 3로 변경
최상단 노드 3와 인접한 노드 4을 스택에 넣고 방문처리한다. -> 최상단 노드가 4로 변경
최상단 노드 4와 인접한 노드 5을 스택에 넣고 방문처리한다. -> 최상단 노드가 5로 변경

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


전체 노드의 탐색 순서(스택에 들어간 순서)는 1-> 2-> 7-> 6-> 8-> 3-> 4-> 5 이다.

DFS 소스코드

위의 예시를 활용하여 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= [
		[],   # 노드의 번호가 1번부터 시작하는 경우가 많기 때문에 인덱스 0에 대한 내용은 비워둠
		[2, 3, 8], # 해당 노드에 인접한 노드 -> 1번 노드는 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

너비 우선 탐색이라고 부르며 가까운 노드에서 우선적으로 탐색하는 알고리즘
-> 큐 자료구조 이용

👀 동작 과정

(과정을 보여주기 위한 예시에서 노드는 1번부터 탐색은 숫자가 낮은 노드부터 하는 것으로 가정한다.)

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

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

큐에서 노드 1을 꺼내 방문하지 않은 인접 노드 2, 3, 8을 큐에 삽입하고 방문 처리한다.

큐에서 노드 2를 꺼내 방문하지 않은 인접 노드 7을 큐에 삽입하고 방문 처리한다.

큐에서 노드 3을 꺼내 방문하지 않은 인접 노드 4,5를 큐에 삽입하고 방문 처리한다.

큐에서 노드 8을 꺼내고 방문하지 않은 인접 노드가 없으므로 무시한다.

-> 큐에서 노드 7을 꺼내 방문하지 않은 인접 노드 6를 큐에 삽입하고 방문 처리한다.
-> 큐에서 노드 4을 꺼내고 방문하지 않은 인접 노드가 없으므로 무시한다.
-> 큐에서 노드 5을 꺼내고 방문하지 않은 인접 노드가 없으므로 무시한다.
-> 큐에서 노드 6을 꺼내고 방문하지 않은 인접 노드가 없으므로 무시한다.

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

전체 노드의 탐색 순서(큐에 들어간 순서)는 1-> 2-> 3-> 8-> 7-> 4-> 5-> 6 이다.

BFS 소스코드

위의 예시를 활용하여 BFS를 코드로 나타내면 다음과 같다.

from collections import deque

# 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

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

visited = [False] * 9

# 정의된 BFS 함수 호출
bfs(graph, 1, visited)

0개의 댓글

관련 채용 정보