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