250x250
반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 매일매일NCS
- BFS
- 문제해결능력
- TOEIC문법
- 토익 영단어
- 영문법
- 다이나믹프로그래밍
- 영단어암기
- NCS수리자료해석
- TOEIC Vocabulary
- 토익문법노트
- BOJ
- 브루트포스
- 공기업공부
- dfs
- 너비우선탐색
- 자료해석
- 수리능력
- 주어
- 파이썬
- 토익문법정리
- 데이터베이스
- 토익시험준비
- 영어문장
- sqld
- 영단어
- 토익단어
- TOEIC
- 알고리즘
- 자바스크립트
Archives
- Today
- Total
하나씩 알아가기
DFS와 BFS 파이썬 코드 본문
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 |