반응형
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
- 청첩장 모임
- github
- 구조 패턴
- docker
- AWS
- Til
- 티스토리챌린지
- amazon ecs
- terraform
- leetcode
- 생성 패턴
- 디자인 패턴
- 지표
- DevOps
- 실용주의 프로그래머
- 신혼 여행
- MAPF
- PostgreSQL
- 14일 공부
- study
- 커머스
- AWS 비용 절감
- Playwright
- Rust
- 오블완
- Go-lang
- 회고
- 경로 계획 알고리즘
- ssh
- 논문 정리
Archives
- Today
- Total
밤 늦게까지 여는 카페
DFS 알고리즘 - 하나를 깊게 파는 것도 중요하다구요! 본문
반응형
안녕하세요. 오늘은 DFS 알고리즘을 공부하려고 합니다.
저번에 공부한 BFS 알고리즘과 비슷한 궤인데 살펴볼까요?
DFS 알고리즘이란
Depth First Search의 약자로 깊이 우선 탐색이라고도 합니다.
DFS 알고리즘의 동작 방식을 간단히 설명드리면 일단 쭈우우욱 갈 수 있는데까지 가본 다음에 다른 길을 살펴보는 탐색법입니다.
DFS 알고리즘 pseudo code
pseudo code는 다음과 같습니다.
- 시작 노드와 연결된 모든 노드의 탐색을 하는 코드입니다.
def DFS(graph, start_node_id):
graph.set_node_visited(start_node_id)
for connected_node in graph.get_connected_nodes(start_node_id):
if connected_node.is_visited:
continue
DFS(graph, connected_node.id)
이제 그림과 함께 살펴보겠습니다!

DFS 알고리즘을 이용해서 노드1에서 탐색을 시작해보겠습니다.
탐색할 노드는 노란색으로 칠했습니다.

DFS 알고리즘 예제 코드
from dataclasses import dataclass
from typing import List
STAGE = 1
@dataclass
class Node:
id: int
is_visited: bool = False
@dataclass
class Edge:
start_node: Node
end_node: Node
def get_other_node(self, node_id: int) -> Node:
if self.start_node.id == node_id:
return self.end_node
else:
return self.start_node
@dataclass
class Graph:
nodes: dict
adjacent_edges: dict
def get_node(self, node_id: int) -> Node:
return self.nodes[node_id]
def set_node_visited(self, node_id: int):
self.nodes[node_id].is_visited = True
def get_connected_nodes(self, node_id: int) -> List[Node]:
adjacent_edges = self.adjacent_edges.get(node_id, [])
return [edge.get_other_node(node_id) for edge in adjacent_edges]
def DFS(graph: Graph, start_node_id: int):
global STAGE
graph.set_node_visited(start_node_id)
print("탐색 {:d}".format(STAGE))
print("방문한 노드: {:d}".format(start_node_id))
print()
for connected_node in graph.get_connected_nodes(start_node_id):
if connected_node.is_visited:
continue
STAGE += 1
DFS(graph, connected_node.id)
if __name__ == "__main__":
nodes = {}
for i in range(6):
nodes[i+1] = Node(id=i+1)
adjacent_edges = {}
adjacent_edges[1] = [Edge(start_node=nodes[1], end_node=nodes[2])]
adjacent_edges[1] += [Edge(start_node=nodes[1], end_node=nodes[3])]
adjacent_edges[2] = [Edge(start_node=nodes[2], end_node=nodes[4])]
adjacent_edges[2] += [Edge(start_node=nodes[2], end_node=nodes[5])]
adjacent_edges[2] += [Edge(start_node=nodes[2], end_node=nodes[6])]
adjacent_edges[3] = [Edge(start_node=nodes[3], end_node=nodes[4])]
adjacent_edges[5] = [Edge(start_node=nodes[5], end_node=nodes[6])]
graph = Graph(nodes=nodes, adjacent_edges=adjacent_edges)
DFS(graph, 1)
실행 결과

DFS 알고리즘은 어떠셨나요?
다음에는 목적지까지의 최단 경로를 구하는 경로 계획 알고리즘을 공부해보려고 합니다.
더 공부하고 싶으신 내용이나 부족한 부분 알려주시면 보완하도록 하겠습니다.
감사합니다 👍
반응형
'알고리즘 > Path Finding' 카테고리의 다른 글
| bellman ford 알고리즘 - dijkstra 알고리즘 다음은 bellman ford죠! (2) | 2023.02.18 |
|---|---|
| dijkstra 알고리즘 - 스타벅스로 가는 가장 짧은 길이 어떻게 되죠? (0) | 2023.01.31 |
| BFS 알고리즘 - 하나만 파지 말고 골고루 하는 건 어떨까요? (0) | 2023.01.20 |
| MAPF 알고리즘들에서 사용되는 지표 - 만들었으면 얼마나 좋은지 봐야겠죠? (0) | 2023.01.15 |
| Improved CBS - CBS의 한계를 개선해보자! (3) (0) | 2023.01.13 |