728x90
얘네는 딱 하나만 기억하면 될거 같다.
DFS는 깊게 트리를 분석하는거, BFS는 한단계씩 전반적으로 파고들어가는것!
DFS부터 봐보자.
graph = {
1: [2, 5, 9],
2: [1, 3],
3: [2, 4],
4: [3],
5: [1, 6, 8],
6: [5, 7],
7: [6],
8: [5],
9: [1, 10],
10: [9]
}
visited = []
def dfs_recursion(adjacent_graph, cur_node, visited_array):
# 구현해보세요!
visited_array.append(cur_node)
for adjacent_node in adjacent_graph:
print(adjacent_node)
if adjacent_node not in visited_array:
dfs_recursion(adjacent_graph, adjacent_node, visited_array)
return
dfs_recursion(graph, 1, visited) # 1 이 시작노드입니다!
print(visited) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 이 출력되어야 합니다!
재귀함수를 이용한 DFS인데 이러면 트리의 깊이가 너무 깊을 시 오류가 발생할 수 있다.
# 위의 그래프를 예시로 삼아서 인접 리스트 방식으로 표현했습니다!
graph = {
1: [2, 5, 9],
2: [1, 3],
3: [2, 4],
4: [3],
5: [1, 6, 8],
6: [5, 7],
7: [6],
8: [5],
9: [1, 10],
10: [9]
}
def dfs_stack(adjacent_graph, start_node):
stack = [start_node]
visited = []
while stack:
current_node = stack.pop()
visited.append(current_node)
for adjacent_node in adjacent_graph[current_node]:
if adjacent_node not in visited:
stack.append(adjacent_node)
# 구현해보세요!
return visited
print(dfs_stack(graph, 1)) # 1 이 시작노드입니다!
# [1, 9, 10, 5, 8, 6, 7, 2, 3, 4] 이 출력되어야 합니다!
그래서 스택을 사용하면 손쉽게 구현할 수 있다!
# 위의 그래프를 예시로 삼아서 인접 리스트 방식으로 표현했습니다!
graph = {
1: [2, 5, 9],
2: [1, 3],
3: [2, 4],
4: [3],
5: [1, 6, 8],
6: [5, 7],
7: [6],
8: [5],
9: [1, 10],
10: [9]
}
def dfs_stack(adjacent_graph, start_node):
stack = [start_node]
visited = []
while stack:
current_node = stack.pop()
visited.append(current_node)
for adjacent_node in adjacent_graph[current_node]:
if adjacent_node not in visited:
stack.append(adjacent_node)
# 구현해보세요!
return visited
print(dfs_stack(graph, 1)) # 1 이 시작노드입니다!
# [1, 9, 10, 5, 8, 6, 7, 2, 3, 4] 이 출력되어야 합니다!
그렇다면 한단계씩 다 검사하는 BFS는???
그렇다 queue 구조로 하면 손쉽게 구현해볼 수 있다.
728x90
'Python > 알고리즘공부' 카테고리의 다른 글
05_catchme 문제! ( 상반기 line인턴채용문제) (1) | 2021.11.05 |
---|---|
04_ 피보나치 수열 및 여러 문제들(hard) (0) | 2021.10.29 |
02_heap (0) | 2021.10.29 |
01_1week (0) | 2021.10.28 |
00_공부시작 배경 (0) | 2021.10.28 |