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

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

JerryiOS 2023. 3. 30. 14:02

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

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

 

κΉŠμ΄μš°μ„ νƒμƒ‰(DFS)

νƒμƒ‰ν•˜λ €λŠ” λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œλΆ€ν„° μš°μ„  νƒμƒ‰ν•˜λŠ” 방식

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

탐색 λ…Έλ“œμ˜ 인접 λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œλ“€μ„ λͺ¨λ‘ νƒμƒ‰ν•˜κ³ , λ‹€μ‹œ λŒμ•„κ°€μ„œ λ‹€λ₯Έ μΈμ ‘λ…Έλ“œμ˜ μžμ‹λ“€μ„ λͺ¨λ‘ νƒμƒ‰ν•©λ‹ˆλ‹€.

탐색 λ…Έλ“œμ˜ κ°€μž₯ κΉŠμ€ λ†’λ“œκΉŒμ§€ λ‹€ 탐색해야 λ‹€μŒ μΈμ ‘λ…Έλ“œλ₯Ό 탐색할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

κ΅¬ν˜„

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

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

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

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

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)μž…λ‹ˆλ‹€.

μž…λ ₯ 자체λ₯Ό λ…Έλ“œμ™€ κ°„μ„ μœΌλ‘œ λ°›κΈ° λ•Œλ¬Έμ— κ·Έλ ‡μŠ΅λ‹ˆλ‹€.

λ°˜μ‘ν˜•