[Swift] κΉμ΄μ°μ νμ(DFS) ꡬνν΄λ³΄κΈ°
μ΄ κΈμ κ°μΈμ μΈ κ³΅λΆλ₯Ό μν΄ μμ±λ κΈμμ λ°νλλ€.
μμΈν λ΄μ©μ https://babbab2.tistory.com/107 μ΄κ³³μ νμΈν΄μ£ΌμΈμ!
κΉμ΄μ°μ νμ(DFS)
νμνλ €λ λ Έλμ μμ λ ΈλλΆν° μ°μ νμνλ λ°©μ
νμ λ Έλμ μΈμ λ Έλμ μμ λ Έλλ€μ λͺ¨λ νμνκ³ , λ€μ λμκ°μ λ€λ₯Έ μΈμ λ Έλμ μμλ€μ λͺ¨λ νμν©λλ€.
νμ λ Έλμ κ°μ₯ κΉμ λλκΉμ§ λ€ νμν΄μΌ λ€μ μΈμ λ Έλλ₯Ό νμν μ μμ΅λλ€.
ꡬν
νμν κ·Έλν 미리 λ§λ€μ΄λκΈ°
let graph: [String: [String]] = [
"A" : ["B", "C"],
"B" : ["A", "D", "E"],
"C" : ["A", "F"],
"D" : ["B"],
"E" : ["B"],
"F" : ["C"],
]
κΉμ΄μ°μ νμμ νλ λ°©λ²
κΉμ΄μ°μ νμμ νκ°μ ν(Queue)μ νκ°μ μ€ν(Stack)μΌλ‘ ꡬνν©λλ€.
needVisitStack : λ°©λ¬Έν΄μΌνλ λ Έλλ₯Ό μ μ₯νλ Stack
visitedQueue : μ΄λ―Έ λ°©λ¬Έν λ Έλλ₯Ό μ μ₯νλ Queue
1. νμν λ Έλμ λ°μ΄ν°λ₯Ό needVisitStackμ λ£μ΅λλ€.
2. needVisitStackμ λ§μ§λ§ κ°μ μΆμΆν΄μ, visitedQueueμ ν΄λΉνλ κ°μ΄ μ‘΄μ¬νλμ§ νμΈν©λλ€.
[μ‘΄μ¬νλ κ²½μ°] - μΆμΆν κ°μ λ²λ¦¬κ³ κ·Έ λ€μ λ§μ§λ§ κ°μ λ€μ μΆμΆνμ¬ visitedQueueμ μ‘΄μ¬νλ μ§ νμΈν©λλ€.
[μ‘΄μ¬νμ§ μλ κ²½μ°] - 3λ² κ³Όμ μΌλ‘ λμ΄κ°λλ€.
3. μΆμΆλ κ°μ΄ visitedQueueμ μ‘΄μ¬νμ§ μμΌλ©΄, visitedQueueμ μΆκ°ν©λλ€.
4. μΆμΆλ κ°μ μ°κ²°λ κ°μ λ€μ λͺ¨λ needVisitStackμ μΆκ°ν©λλ€.
5. needVisitStackμ΄ λΉ λκΉμ§ 2λ²λΆν° λ°λ³΅ν©λλ€.
6. needVisitStackμ΄ λͺ¨λ λΉμμ κ²½μ° visitedQueueμ μ±μμ§ κ°λ€μ΄ νμλ λ Έλλ€μ μμμΈ κ²μΌλ‘ κ²°λ‘ μ§μ΅λλ€.
μ½λ
func DFS(graph: [String: [String]], start: String) -> [String] {
var visitedQueue: [String] = []
var needVisitStack: [String] = [start]
while !needVisitStack.isEmpty {
let node: String = needVisitStack.removeLast()
if visitedQueue.contains(node) { continue }
visitedQueue.append(node)
needVisitStack += graph[node] ?? []
}
return visitedQueue
}
κΉμ΄μ°μ νμ(DFS)μ μκ° λ³΅μ‘λ
μΌλ°μ μΌλ‘ λ Έλ μ(V), κ°μ μ(E)λΌ νμ λ μκ°λ³΅μ‘λλ O(V+E)μ λλ€.
μ λ ₯ μ체λ₯Ό λ Έλμ κ°μ μΌλ‘ λ°κΈ° λλ¬Έμ κ·Έλ μ΅λλ€.