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 |
Tags
- rds
- aws
- lambda
- cloudwatch
- Lamda
- sns
- SageMaker
- 병목
- PACELC
- CHECK
- amazonqcli
- CAP
- fcm
- Validation
- kubernetes
- 분산시스템
- terraform
- IaC
- serverless
Archives
- Today
- Total
잡다한 IT 지식
DFS 본문
참고한 영상
DFS 위키백과
깊이 우선 탐색(Depth-First Search)
최대한 깊은 단계까지 우선 검색하는 방법.
구현방법으론 스택과 재귀식 구현이 있음.

- 장점
- 단지 현 경로상의 노드들만을 기억하면 되므로 저장공간의 수요가 비교적 적다.
- 목표노드가 깊은 단계에 있을 경우 해를 빨리 구할 수 있다.
- 단점
- 해가 없는 경로에 깊이 빠질 가능성이 있다. 따라서 실제의 경우 미리 지정한 임의의 깊이까지만 탐색하고 목표노드를 발견하지 못하면 다음의 경로를 따라 탐색하는 방법이 유용할 수 있다.
- 얻어진 해가 최단 경로가 된다는 보장이 없다. 이는 목표에 이르는 경로가 다수인 문제에 대해 깊이우선 탐색은 해에 다다르면 탐색을 끝내버리므로, 이때 얻어진 해는 최적이 아닐 수 있다는 의미이다.
영상 보면서 직접 코틀린으로 구현해본 소스 코드.

import java.util.*
class Graph(val size : Int = 10) {
val nodes: Array<Node> = Array<Node>(10, { i -> (Node(i))})
class Node(var data : Int = 0, var adjacent : LinkedList<Node> = LinkedList(), var marked : Boolean = false)
fun addEdge(original : Int, adjacent : Int) { //인접 노드 설정하는 메소드.
val node1 = nodes[original]
val node2 = nodes[adjacent]
if (!node1.adjacent.contains(node2)) {
node1.adjacent.add(node2)
}
if (!node2.adjacent.contains(node1)) {
node2.adjacent.add(node1)
}
}
fun dfs() {
dfs(0)
}
fun dfs(index : Int) {
val root : Node = nodes[index]
val stack : Stack<Node> = Stack<Node>()
stack.push(root)
root.marked = true
while(!stack.empty()) {
val r : Node = stack.pop()
for (n : Node in r.adjacent) {
if (n.marked == false) {
n.marked = true
stack.push(n)
}
}
println(r.data)
}
}
}
fun main() {
val graph : Graph = Graph(10)
graph.addEdge(0,1)
graph.addEdge(1,3)
graph.addEdge(1,4)
graph.addEdge(3,7)
graph.addEdge(3,8)
graph.addEdge(4,9)
graph.addEdge(0,2)
graph.addEdge(2,5)
graph.addEdge(2,6)
graph.dfs()
}
//출력 결과
0
2
6
5
1
4
9
3
8
7'알고리즘 문제 풀이 > 개념' 카테고리의 다른 글
| 백준 - 트리 순회(Kotlin) : 트리를 구현해보는 개념 문제 (0) | 2022.08.03 |
|---|---|
| 안드로이드 - 권한 (0) | 2022.06.22 |
| 알고리즘 - 분할정복 (0) | 2022.05.22 |
| 안드로이드 Manifest (0) | 2021.06.29 |