πŸ’» CS/μ•Œκ³ λ¦¬μ¦˜

[Swift] λ„ˆλΉ„μš°μ„ νƒμƒ‰(BFS) κ΅¬ν˜„ν•΄λ³΄κΈ°

JerryiOS 2023. 3. 29. 17:31

이 글은 개인적인 곡뢀λ₯Ό μœ„ν•΄ μž‘μ„±λœ κΈ€μž„μ„ λ°νž™λ‹ˆλ‹€.

μžμ„Έν•œ λ‚΄μš©μ€ https://babbab2.tistory.com/106 μ΄κ³³μ—μ„œ ν™•μΈν•΄μ£Όμ„Έμš”!

 

λ„ˆλΉ„μš°μ„ νƒμƒ‰(BFS)

좜처 : https://babbab2.tistory.com/106

Breadth-First Search

μΈμ ‘ν•œ λ…Έλ“œλ₯Ό μš°μ„ ν•˜μ—¬ νƒμƒ‰ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

탐색 λ…Έλ“œλ‘œλΆ€ν„° μΈμ ‘ν•œ λ…Έλ“œλ₯Ό λ¨Όμ € νƒμƒ‰ν•˜κ³ , λ‹€ νƒμƒ‰ν•˜λ©΄ μΈμ ‘ν•œ λ…Έλ“œμ˜ μΈμ ‘ν•œ λ…Έλ“œλ“€λΆ€ν„° νƒμƒ‰ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ 같은 λ ˆλ²¨μ— μžˆλŠ” λ…Έλ“œλ“€λΆ€ν„° νƒμƒ‰ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

 

참고둜 μ™Όμͺ½λΆ€ν„° 탐색할지, 였λ₯Έμͺ½λΆ€ν„° 탐색할지 같은 μˆœμ„œλŠ” μ€‘μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

κ΅¬ν˜„

1. 탐색할 κ·Έλž˜ν”„ 미리 λ§Œλ“€μ–΄λ‘κΈ°

좜처 : https://babbab2.tistory.com/106

let graph: [String: [String]] = [
    "A" : ["B", "C"],
    "B" : ["A", "D", "E"],
    "C" : ["A", "F"],
    "D" : ["B"],
    "E" : ["B"],
    "F" : ["C"],
]

μœ„ 그림을 인접 λ¦¬μŠ€νŠΈλ°©μ‹μœΌλ‘œ κ·Έλž˜ν”„λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

 

2. λ„ˆλΉ„μš°μ„  νƒμƒ‰ν•˜κΈ°

λ„ˆλΉ„μš°μ„ νƒμƒ‰μ€ λ‘κ°œμ˜ 큐(Queue)둜 κ΅¬ν˜„ν•©λ‹ˆλ‹€.

 

needVisitQueue : λ°©λ¬Έν•΄μ•Όν•˜λŠ” λ…Έλ“œλ₯Ό μ €μž₯ν•˜λŠ” 큐

visitedQueue : 이미 λ°©λ¬Έν•œ λ…Έλ“œλ₯Ό μ €μž₯ν•˜λŠ” 큐

 

그리고 μ•„λž˜μ™€ 같은 μˆœμ„œλ‘œ 탐색을 μ§„ν–‰ν•©λ‹ˆλ‹€.

 

visitedQueue와 needVisitQueue

 

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)κ°€ λœλ‹€.

μž…λ ₯ 자체λ₯Ό λ…Έλ“œμ™€ κ°„μ„ μœΌλ‘œ λ°›κΈ° λ•Œλ¬Έμ΄λ‹€.

λ°˜μ‘ν˜•