티스토리 뷰
DFS(Depth First Search, 깊이 우선 탐색)
BFS(Breadth First Search, 너비 우선 탐색)
DFS(Depth First Search, 깊이 우선 탐색) 란
루트 노드 혹은 다른 임의의 노드에서 다음 분기(Branch)로 넘어가 기전에 해당 분기를 완벽하게 탐색하는 방법이며 스택(Stack) 혹은 재귀함수(Recursion)로 구현된다.
코드(Python)
"""
1
/ | \
2 5 9
| /\ |
3 6 8 10
/ |
4 7
"""
graph = {
1: [2,5,9],
2: [3],
3: [4],
4: [],
5: [6,8],
6: [7],
7: [],
8: [],
9: [10],
10: []
}
def recursive_dfs(v, visited = []):
visited.append(v) # 시작 정점 방문
for w in graph[v]:
if not w in visited: # 방문 하지 않았으면
visited = recursive_dfs(w, visited)
return visited
def iterative_dfs(start_v):
visited = []
stack = [start_v]
while stack:
v = stack.pop()
if v not in visited:
visited.append(v)
for w in graph[v]:
stack.append(w)
return visited
print("recursive_dfs: ", recursive_dfs(1))
print("iterative_dfs: ", iterative_dfs(1))
# 스택은 마지막에 스택에 담은 정점부터 꺼내져 방문되기 때문에
# 재귀 방식과 결과가 다름.
"""
recursive_dfs: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
iterative_dfs: [1, 9, 10, 5, 8, 6, 7, 2, 3, 4]
"""
BFS(Breadth First Search, 너비 우선 탐색) 란
루트 노드 혹은 다른 임의의 노드에서 인접한 노드를 먼저 탐색하는 방법이며 큐(Queue)를 사용하여 구현된다.
코드(Python)
🙌 Queue 사용
"""
1
/ | \
2 3 4
| /\ |
5 6 7 8
/ |
9 10
"""
graph = {
1: [2,3,4],
2: [5],
3: [6,7],
4: [8],
5: [9],
6: [10],
7: [],
8: [],
9: [],
10: []
}
def bfs(start_v):
visited = [start_v]
queue = [start_v]
while queue:
v = queue.pop(0)
for w in graph[v]:
if w not in visited:
visited.append(w)
queue.append(w)
return visited
print("bfs: ", bfs(1))
"""
bfs: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
"""
리스트 사용 시 pop(0) 은 시간 복잡도가 O(n) 이므로 좋지 않다. 따라서 리스트 보다는 양방향으로 append, pop 이 가능한
Deque를 사용하여 문제를 풀이하는 것이 좋다.
🙌 Deque 사용
from collections import deque
def bfs(start_v):
visited = [start_v]
deq = deque()
deq.append(start_v)
while deq:
v = deq.popleft()
for w in graph[v]:
if w not in visited:
visited.append(w)
deq.append(w)
return visited
Reference
[Algorithm] DFS, BFS 구현 (Python)
DFS, BFS를 파이썬으로 구현해 보자
devyuseon.github.io
[코딩테스트 대비] DFS, BFS 정리
DFS, BFS 정리 DFS, BFS는 그래프에 속하는 알고리즘이다. 코딩테스트에서 경로를 찾는 문제에서 많이 출제가 된다. DFS Root Node 혹은 다른 임의의 Node에서 다음 분기(Branch)로 넘어가기 전에 해당 분기
developer-mac.tistory.com
'Study > CS' 카테고리의 다른 글
[Software Engineering] 리팩토링(Refactoring) 과 시큐어 코딩(Secure Coding) (0) | 2022.09.04 |
---|---|
[Software Engineering] 클린 코드(Clean Code) (2) | 2022.09.04 |
[알고리즘] 최소 공통 조상(Lowest Common Ancestor, LCA) (0) | 2022.08.27 |
[알고리즘] 이진 탐색(Binary Search, 이분 탐색) (0) | 2022.08.20 |
[알고리즘] LIS(Longest Increasing Sequence) (0) | 2022.08.20 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 자료구조와알고리즘 23강
- CS 스터디
- 연결리스트활용
- CS.
- 코드업 기초
- 리스트
- CS
- https
- 프로그래머스
- 프로그래머스강의
- 정렬
- 자바
- 보험
- 리스트함축
- Greedy sort
- 파이썬
- 이진탐색
- 알고리즘
- 데이터베이스
- 네트워크
- 프로세스 주소공간
- 리스트2
- 리스트 복사
- It
- 이차 리스트
- 스터디
- 자료구조
- 완전탐색
- 운영체제
- SW
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함