μλ νμΈμ μ μΈμ λλ€:)
μ€λμ μ λ² μκ³ λ¦¬μ¦ ν¬μ€ν (DFS)μ μ΄μ΄ BFS(λλΉ μ°μ νμ)μ λν΄ μ 리ν΄λ³΄λ € ν©λλ€!
μμνκΈ° μ μ, νμ μκ³ λ¦¬μ¦ μ€ νλμΈ BFSλ₯Ό μ΄ν΄νλ €λ©΄ μ°μ κ·Έλνμ λν μ΄ν΄λΆν° νμνλ
νΉμ κ·Έλνμ λν΄ μ λͺ¨λ₯΄μ λ€λ©΄ μλ λ§ν¬λ‘ κ±Έμ΄λ μ΄μ ν¬μ€ν μ μ°Έκ³ ν΄μ£Όμλ©΄ μ’μ κ² κ°μ΅λλ€!!
BFS
BFS(Breadth First Search)λ 'λλΉ μ°μ νμ'μ΄λΌλ μλ―Έλ₯Ό κ°μ§λλ€.
μ½κ² λ§ν΄ κ·Έλνμ κ°κΉμ΄ λ ΈλλΆν° νμνλ μκ³ λ¦¬μ¦μ λλ€!
μ§λ ν¬μ€ν μμ μ 리νμλ DFSλ κ·Έλνμ κ°μ₯ κΉμ κ³³, μ¦ κ°μ₯ λ©λ¦¬ μλ λ Έλλ₯Ό μ°μ μΌλ‘ νμνλ λ°©μμΌλ‘ λμνλ μκ³ λ¦¬μ¦μ΄μλλ°μ, BFSλ κ·Έ λ°λλ‘ μΈμ ν λ Έλλ€μ μ°μ μΌλ‘ νμνλ λ°©μμ λλ€.
λλΉ μ°μ νμ λ°©μμ νμ μμλ₯Ό κ·Έλ¦ΌμΌλ‘ λνλ΄λ³΄μλ©΄, μμ κ°μ΅λλ€!
1λ² λ ΈλλΆν° νμμ μμνλ€κ³ νλ©΄ μΈμ ν λ Έλλ€μ νμνκ³ , νμμ΄ λλλ©΄ λ°©κΈ νμνλ λ Έλμ μΈμ ν λ Έλλ₯Ό νμν©λλ€.
μ΄ λ, νμ¬ λ Έλμ μΈμ λ Έλλ€ μ€μμ μ΄λ€ λ Έλλ₯Ό λ¨Όμ νμνλμ§λ μ€μνμ§ μμ΅λλ€.
μμ μμμμ 2, 3λ²μ΄ λ°λμ΄λ λκ³ , 4, 5, 6λ² λ Έλλ€ μ€ μ΄λ κ² λ¨Όμ νμν΄λ μκ΄μλ€λ κ²μ΄μ£ !
μ¦, κ°μ λ 벨μ μλ λ Έλλ€ μ€μμλ μ΄λ κ² λ¨Όμ νμνλλλ μ€μνμ§ μκ³ , νμ¬ λ Έλμμ μΈμ ν κ°μ λ 벨μ μλ λ Έλλ€μ νμμ΄ λλλ©΄, λ€μ λ 벨μ λ Έλλ€μ νμμΌλ‘ λμ΄κ°λ€κ³ μκ°νλ©΄ μ’μ κ² κ°μ΅λλ€!
BFS ꡬνλ°©λ²
κ·Έλ λ€λ©΄ BFSλ μ€μ λ‘ μ΄λ€ λ°©μμΌλ‘ ꡬνν μ μμκΉμ??
BFSλ λ³΄ν΅ μ μ μ μΆ(FIFO) λ°©μμΈ ν(Queue) μλ£κ΅¬μ‘°λ₯Ό μ΄μ©νμ¬ κ΅¬νν©λλ€!
μΈμ ν λ Έλλ₯Ό λ°λ³΅μ μΌλ‘ νμ λ£λλ‘ μκ³ λ¦¬μ¦μ μμ±νλ©΄ μμ°μ€λ½κ² λ¨Όμ λ€μ΄μ¨ κ²μ΄ λ¨Όμ λκ°κ² λμ΄, κ°κΉμ΄ λ ΈλλΆν° νμμ μ§ννκ² λ©λλ€.
μκ³ λ¦¬μ¦μ μ νν λμ λ°©μμ λ€μκ³Ό κ°μ΅λλ€.
1. νμ μμ λ Έλλ₯Ό νμ μ½μ νκ³ λ°©λ¬Έ μ²λ¦¬λ₯Ό ν©λλ€.
2. νμμ λ Έλλ₯Ό κΊΌλ΄ ν΄λΉ λ Έλμ μΈμ λ Έλ μ€μμ λ°©λ¬Ένμ§ μμ λ Έλλ₯Ό λͺ¨λ νμ μ½μ νκ³ λ°©λ¬Έ μ²λ¦¬λ₯Ό ν©λλ€.
3. 2λ²μ κ³Όμ μ λ μ΄μ μνν μ μμ λκΉμ§ λ°λ³΅ν©λλ€.
μ΄μ κ°λ¨ν μμ λ‘ μ€μ μ½λλ₯Ό 보면μ BFSλ₯Ό μ΄ν΄ν΄λ΄ μλ€!
μμ κ°μ ꡬ쑰μ κ·Έλνλ₯Ό 1λ² λ Έλλ₯Ό μμ λ Έλλ‘ μ€μ νμ¬ BFSλ₯Ό μ΄μ©ν΄ νμμ ν΄λ³΄λλ‘ νκ² μ΅λλ€.
κ°μ₯ λ¨Όμ μμ λ ΈλμΈ 1μ νμ μ½μ νκ³ λ°©λ¬Έ μ²λ¦¬λ₯Ό ν©λλ€.
νμμ λ Έλ 1μ κΊΌλ΄κ³ λ€μμΌλ‘ 1λ² λ Έλμ μΈμ λ Έλλ€μ νμ μ½μ ν΄μΌνλλ°,
μμ κ·Έλνμμ 1λ² λ Έλμ μ°κ²°λ μΈμ λ Έλλ 2, 3, 8 μ΄λ κ² μΈ κ°κ° μμΌλ λͺ¨λ νμ μ½μ νκ³ λ°©λ¬Έ μ²λ¦¬λ₯Ό ν©λλ€.
κ·Έ λ€μμΌλ‘, μ½μ ν λ Έλλ€ μ€ λ¨Όμ 2λ² λ Έλλ₯Ό κΊΌλ΄κ³ λ°©λ¬Ένμ§ μμ 2λ² λ Έλμ μΈμ λ ΈλμΈ 7μ νμ μ½μ νκ³ λ°©λ¬Έ μ²λ¦¬λ₯Ό ν©λλ€.
λ€μμ 3λ² λ Έλλ₯Ό κΊΌλ΄μ£Όκ³ 3λ² λ Έλμ μΈμ λ Έλλ€μΈ 4, 5λ₯Ό νμ μ½μ ν λ°©λ¬Έ μ²λ¦¬λ₯Ό ν΄μ€λλ€.
μ΄μ 8λ² λ Έλλ₯Ό κΊΌλ΄μ€ μ°¨λ‘μΈλ°, 8λ² λ Έλμ μΈμ λ Έλλ€ μ€ λ°©λ¬Ένμ§ μλ λ Έλλ μμΌλ―λ‘ νμ¬ λ¨κ³μμ μ½μ ν λ Έλλ μκ² μ£ ?
κ·Έλ λ€λ©΄ λ°λ‘ λ€μ λ ΈλμΈ 7λ² λ Έλλ₯Ό κΊΌλ΄ μ€λλ€. 7λ² λ Έλμ μΈμ λ Έλ μ€ λ°©λ¬Ένμ§ μμ λ ΈλμΈ 6μ νμ μ½μ νκ³ λ°©λ¬Έ μ²λ¦¬λ₯Ό ν©λλ€.
μ΄μ λ°©λ¬Ένμ§ μμ λ
Έλκ° μμΌλ―λ‘ νμ λ¨μμλ λ
Έλλ₯Ό μ°¨λ‘λ‘ κΊΌλ΄μ£Όλ©΄ νμ κ³Όμ μ΄ λλκ² λ©λλ€.
κ²°κ³Όμ μΌλ‘ λ
Έλμ νμ μμ(=νμ μ½μ
λ μμ)λ 1 -> 2 -> 3 -> 8 -> 7-> 4 -> 5 -> 6 μ΄ λ©λλ€.
μμ κ³Όμ μ μ½λλ‘ κ΅¬ννλ€λ©΄ μλμ κ°μ΄ ꡬνν μ μμ΅λλ€.
// 2μ°¨μ λ°°μ΄
let graph = [[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]]
func bfs(_ graph: [[Int]], _ start: Int) -> [Int] {
var visitedQueue = [Int]() // λ°©λ¬Έν λ
Έλ μ μ₯νλ λ°°μ΄
var needVisitQueue = [start] // λ°©λ¬Έν λ
Έλ μ μ₯νλ λ°°μ΄
while !needVisitQueue.isEmpty {
let node = needVisitQueue.removeFirst() // νλ FIFOλ‘ λμ
if visitedQueue.contains(node) { continue } // μ΄λ―Έ λ°©λ¬Έν λ
ΈλλΌλ©΄ μλ κ³Όμ 건λ λ
visitedQueue.append(node) // νμ¬ λ
Έλ λ°©λ¬Έμ²λ¦¬
needVisitQueue += graph[node]
}
return visitedQueue
}
// μμ λ
Έλλ₯Ό 1λ‘ μ€μ νμ¬ ν¨μ νΈμΆ
bfs(graph, 1) // [1, 2, 3, 8, 7, 4, 5, 6]
[μ°Έκ³ μλ£]
<μ΄κ²μ΄ μ½λ© ν μ€νΈλ€ with νμ΄μ¬>