λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ–₯ CS/Algorithm

[Algorithm/Swift] BFS(λ„ˆλΉ„ μš°μ„  탐색) Swift둜 κ΅¬ν˜„ν•΄λ³΄κΈ°

μ•ˆλ…•ν•˜μ„Έμš” μ œμΈμž…λ‹ˆλ‹€:)

μ˜€λŠ˜μ€ μ €λ²ˆ μ•Œκ³ λ¦¬μ¦˜ ν¬μŠ€νŒ…(DFS)에 이어 BFS(λ„ˆλΉ„ μš°μ„  탐색)에 λŒ€ν•΄ 정리해보렀 ν•©λ‹ˆλ‹€!

μ‹œμž‘ν•˜κΈ° 전에, 탐색 μ•Œκ³ λ¦¬μ¦˜ 쀑 ν•˜λ‚˜μΈ BFSλ₯Ό μ΄ν•΄ν•˜λ €λ©΄ μš°μ„  κ·Έλž˜ν”„μ— λŒ€ν•œ 이해뢀터 ν•„μš”ν•˜λ‹ˆ

ν˜Ήμ‹œ κ·Έλž˜ν”„μ— λŒ€ν•΄ 잘 λͺ¨λ₯΄μ‹ λ‹€λ©΄ μ•„λž˜ 링크둜 κ±Έμ–΄λ‘” 이전 ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•΄μ£Όμ‹œλ©΄ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€!!

 

[Algorithm/Swift] DFS(깊이 μš°μ„  탐색) Swift둜 κ΅¬ν˜„ν•΄λ³΄κΈ°

μš”μ¦˜ λΌλŠ” μ±…μœΌλ‘œ μ•Œκ³ λ¦¬μ¦˜ κ°œλ…λ“€μ„ ν•˜λ‚˜μ”© 뿌수고 μžˆλŠ”λ°μš”, 이 책이 파이썬 μ–Έμ–΄λ₯Ό κΈ°μ€€μœΌλ‘œ μ„€λͺ…λ˜μ–΄μžˆμ–΄μ„œ κ°œλ…μ„ ν•™μŠ΅ν•˜κ³ , μ˜ˆμ œλ‚˜ μ‹€μ „ λ¬Έμ œλ“€μ„ Swiftμ–Έμ–΄λ‘œ ν’€μ΄ν•΄λ³΄λŠ” λ°©μ‹μœΌλ‘œ μ°¨κ·Ό

janechoi.tistory.com

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]

 


[참고 자료]

 

Swift) λ„ˆλΉ„ μš°μ„  탐색(BFS) κ΅¬ν˜„ 해보기

μ•ˆλ…•ν•˜μ„Έμš” :) μ†Œλ“€μž…λ‹ˆλ‹€!!! 이번 ν¬μŠ€νŒ…μ—μ„  λ„ˆλΉ„ μš°μ„  탐색(BFS)에 λŒ€ν•΄ μ•Œμ•„λ³΄λ €κ³  ν•΄μš”!!!! λ¨Όμ €, λ„ˆλΉ„ μš°μ„  νƒμƒ‰μ΄λž€ κ·Έλž˜ν”„λ₯Ό νƒμƒ‰ν•˜λŠ” 방법 쀑 ν•˜λ‚˜μΈλ°, κ·Έλž˜ν”„λ₯Ό λͺ¨λ₯΄λ©΄ 이해할 수 μ—†μœΌλ‹ˆ

babbab2.tistory.com

<이것이 μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with 파이썬>

 

이것이 취업을 μœ„ν•œ μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with 파이썬 | λ‚˜λ™λΉˆ - ꡐ보문고

이것이 취업을 μœ„ν•œ μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with 파이썬 | IT 취쀀생이라면 λˆ„κ΅¬λ‚˜ μž…μ‚¬ν•˜κ³  싢은 μΉ΄μΉ΄μ˜€γ†μ‚Όμ„±μ „μžγ†λ„€μ΄λ²„γ†λΌμΈ! μ·¨μ—…μ˜ 성곡 μ—΄μ‡ λŠ” μ•Œκ³ λ¦¬μ¦˜ 인터뷰에 μžˆλ‹€!IT 취쀀생이라면 λˆ„κ΅¬λ‚˜

product.kyobobook.co.kr