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
- stack&que
- pytest
- AWS
- Bruteforce
- Django
- ws
- ORM
- Python
- 백준
- Gunicorn
- stateless
- Q objects
- greedy
- was
- utils
- Unit Testing
- stateful
- Stack
- Git
- postreSQL
- Programmers
- combinations
- permutations
- dictionary
- SQL
- algorithm
- codecov
- HTTP 완벽 가이드
- Query
- TDD
Archives
- Today
- Total
해피 코딩!
그래프 기본 탐색 알고리즘 - BFS, DFS 본문
BFS
graph = {
'A': ['B'],
'B': ['A', 'C', 'H'],
'C': ['B', 'D'],
'D': ['C', 'E', 'G'],
'E': ['D', 'F'],
'F': ['E'],
'G': ['D'],
'H': ['B', 'I', 'J', 'M'],
'I': ['H'],
'J': ['H', 'K'],
'K': ['J', 'L'],
'L': ['K'],
'M': ['H']
}
def bfs(graph, start_node):
# 아래와 다르게 visited를 딕셔너리로 함으로서,
visited = {}
need_visited_queue = []
need_visited_queue.append(start_node)
while need_visited_queue:
node = need_visited_queue.pop(0)
# 여기서 O(N)에 해당하는 경우를, O(1)로 줄일 수 있다.
if node not in visited:
visited[node] = True
need_visited_queue.extend(graph[node])
return visited.keys()
data =bfs(graph, 'A')
print(' '.join(data))
# 출력 결과
# A B C H D I J M E G K F L
graph = {
'A': ['B'],
'B': ['A', 'C', 'H'],
'C': ['B', 'D'],
'D': ['C', 'E', 'G'],
'E': ['D', 'F'],
'F': ['E'],
'G': ['D'],
'H': ['B', 'I', 'J', 'M'],
'I': ['H'],
'J': ['H', 'K'],
'K': ['J', 'L'],
'L': ['K'],
'M': ['H']
}
def bfs(graph, start_node):
# 순회를 완료한 값들을 저장할 딕셔너리
visited= []
# 순회하기 위해 대기중인 값들
need_visited = []
need_visited.append(start_node)
# 순회가 완료될 때 까지 반복
while need_visited:
# 꺼내온 값은 무조건 pop으로 꺼낸다. 그래야 visited에 이미 있던 값도 순회하며 need_visited에서 제거되기 때문.
node = need_visited.pop(0)
# 만약 visited에 없다면, visited에 추가하며 graph[node]에 있는 값을 need_visited에 추가하며 지속적으로 순회가 가능하다.
if node not in visited:
visited.append(node)
need_visited.extend(graph[node])
return visited
print(' '.join(bfs(graph, 'A')))
# 출력 결과
# A B C H D I J M E G K F L
adj_list = [[2,1 ], [3, 0], [3, 0], [9, 8, 2, 1], [5], [7, 6, 4], [7, 5], [6, 5], [3], [3]]
N= len(adj_list)
visited = [False] * N
def dfs(v):
visited[v] = True
print(v, ' ', end='')
for w in adj_list[v]:
if not visited[w]:
dfs(w)
print('DFS 방문 순서')
for i in range(N):
if not visited[i]:
dfs(i)
# 출력 결과
# DFS 방문 순서
# 0 2 3 9 8 1 4 5 7 6
DFS
DFS는 BFS와 달리 스택의 형태를 가진다.
graph = {
'A': ['B', 'C'],
'B': ['A', 'D'],
'C': ['A', 'G', 'H', 'I'],
'D': ['B', 'E', 'F'],
'E': ['D'],
'F': ['D'],
'G': ['C'],
'H': ['C'],
'I': ['C', 'J'],
'J': ['I']
}
def dfs(graph, start_node):
visited = {}
need_visited_stack = []
need_visited.append(start_node)
while need_visited:
node = need_visited.pop()
if node not in visited:
visited[node] = True
need_visited.extend(graph[node])
return visited
print(' '.join(dfs(graph, 'A')))
graph = {
'A': ['B', 'C'],
'B': ['A', 'D'],
'C': ['A', 'G', 'H', 'I'],
'D': ['B', 'E', 'F'],
'E': ['D'],
'F': ['D'],
'G': ['C'],
'H': ['C'],
'I': ['C', 'J'],
'J': ['I']
}
def dfs(graph, start_node):
visited = []
need_visited_stack = []
need_visited_stack.append(start_node)
while need_visited_stack:
node = need_visited_stack.pop()
if node not in visited:
visited.append(node)
need_visited_stack.extend(graph[node])
return visited
print(' '.join(dfs(graph, 'A')))
# 출력 결과
# A C I J H G B D F E
'알고리즘' 카테고리의 다른 글
순열과 조합 - combinations, permutations (0) | 2020.12.19 |
---|---|
[프로그래머스] 피보나치 수 (0) | 2020.12.17 |
[백준] 요세푸스 문제0 (0) | 2020.12.12 |
[백준] 영화감독 숌 1436번 (0) | 2020.12.12 |
[백준] 블랙잭 2798번 (0) | 2020.12.12 |
Comments