DFS
원소를 최대한 깊게 따라가며 탐색하는 방법
즉, 인접한 노드 중 방문하지 않은 모든 노드들을 저장해두고,
가장 마지막에 넣은 노드들만 꺼내서 탐색하면 됨
가장 마지막에 넣은 노드들? → 스택을 이용하여 DFS를 재귀 없이 구현할 수 있다.
구현방법
- 루트 노드를 스택에 넣는다.
- 현재 스택의 노드를 빼서 visited에 추가한다.
- 현재 방문한 노드와 인접한 노드 중 방문하지 않은 노드를 스택에 추가한다.
- 2부터 반복한다.
- 스택이 비면 탐색을 종료한다.
코드 구현
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
BFS
현재 인접한 노드 먼저 방문한다.
다시 말하면 인접한 노드 중 방문하지 않은 모든 노드들을 저장해두고,
가장 처음에 넣은 노드를 꺼내서 탐색하면 된다.
가장 처음에 넣은 노드? → 큐를 이용하면 BFS를 구현할 수 있다.
구현방법
- 루트 노드를 큐에 넣는다
- 현재 큐의 노드를 빼서 visited에 추가한다.
- 현재 방문한 노드와 인접한 노드 중 방문하지 않은 노드를 큐에 추가한다.
- 2부터 반복한다.
- 큐가 비면 탐색을 종료한다.
코드 구현
def bfs_queue(adj_graph, start_node):
queue = [start_node]
visited = []
while queue:
current_node = queue.pop(0)
visited.append(current_node)
for adjacent_node in adj_graph[current_node]:
if adjacent_node not in visited:
queue.append(adjacent_node)
return visited
오늘 알고리즘...
백준 2630 색종이 문제에서 너무 많은 시간을 보냈다.
30분간 고민하고 그냥 찾아보려 했는데 될랑말랑 했던게 더 시간을 잡았먹었다.
찾아보니 global이라는 전역변수 설정을 안해서 그랬다....
이것도 파이썬 문법이 부족했던게 아닌가라는 생각이 들면서, 이런거였으면
시간을 너무 허비하지말고 진작 찾아볼거라는 생각이 들었다.
다시는 너무 시간을 허비하지말자......
'HangHae99' 카테고리의 다른 글
WIL 2021/06/27 3주차회고 (0) | 2021.06.28 |
---|---|
TIL 2021/06/22 16일차 (0) | 2021.06.22 |
WIL 2주차 회고 (0) | 2021.06.20 |
TIL 2021/06/18~2021/06/19 12~13일차 (0) | 2021.06.20 |
TIL 2021/06/17 11일차 (0) | 2021.06.18 |