728x90
참고한 영상
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
728x90
반응형
'알고리즘 문제 풀이 > 개념' 카테고리의 다른 글
백준 - 트리 순회(Kotlin) : 트리를 구현해보는 개념 문제 (0) | 2022.08.03 |
---|---|
안드로이드 - 권한 (0) | 2022.06.22 |
알고리즘 - 분할정복 (0) | 2022.05.22 |
안드로이드 Manifest (0) | 2021.06.29 |