Bibi's DevLog ๐Ÿค“๐ŸŽ

[Swift] ๊ทธ๋ž˜ํ”„์™€ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ DFS/BFS (์„ค๋ช… ๋ฐ ๊ตฌํ˜„ ์˜ˆ์ œ) ๋ณธ๋ฌธ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Algorithm ์•Œ๊ณ ๋ฆฌ์ฆ˜

[Swift] ๊ทธ๋ž˜ํ”„์™€ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ DFS/BFS (์„ค๋ช… ๋ฐ ๊ตฌํ˜„ ์˜ˆ์ œ)

๋น„๋น„ bibi 2023. 1. 13. 17:08

[Swift] ๊ทธ๋ž˜ํ”„์™€ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ DFS/BFS

๊ฐ€์žฅ ๋„์›€์ด ๋œ ๊ธ€.. https://nareunhagae.tistory.com/56 ๐Ÿ™
'์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค' ์ฑ…๋„ ํ•จ๊ป˜ ์ฐธ๊ณ ํ•ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„ Graph

๊ทธ๋ž˜ํ”„์—์„œ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ •์ (๋…ธ๋“œ)๋กœ ๋‚˜ํƒ€๋‚ด๊ณ , ๋ชจ๋“  ๊ด€๊ณ„๋Š” ๊ฐ„์„ ์œผ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค.

https://user-images.githubusercontent.com/67407678/209046472-3dd53837-7e36-4de0-adb1-065f65785b0d.png

  • ๋…ธ๋“œ Node / ์ •์  Vertex
    • ๊ทธ๋ž˜ํ”„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๋‹จ์œ„. (๊ทธ๋ฆผ์—์„œ์˜ ๋™๊ทธ๋ผ๋ฏธ = ๋…ธ๋“œ)
    • ๋‘ ๋…ธ๋“œ๊ฐ€ ์ธ์ ‘ํ•˜๋‹คadjacent : ๋‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ„์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ์„ ์˜๋ฏธ
  • ๊ฐ„์„  Edge
    • ๋…ธ๋“œ ์‚ฌ์ด๋ฅผ ์ž‡๋Š” ์„ .
  • ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ : ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘์œผ๋กœ ๋‹ค์ˆ˜์˜ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ์ค‘ 1์ฐจ์› ๋ฐฐ์—ด, 2์ฐจ์›” ๋ฐฐ์—ด ํƒ์ƒ‰ ๋ฌธ์ œ๋ฅผ ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜ํ”„ ํ‘œํ˜„

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ทธ๋ž˜ํ”„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹.

  1. ์ธ์ ‘ ํ–‰๋ ฌ Adjacency Matrix : 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ทธ๋ž˜ํ”„์˜ ๊ฐ ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„ ํ‘œํ˜„

    1. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„ ๊ทธ๋ž˜ํ”„๋Š” [[0, 7, 5], [7, 0, Int.max], [5, Int.max, 0]] ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•œ๋‹ค.
    2. ์ž์‹ ๊ณผ์˜ ๊ฑฐ๋ฆฌ๋Š” 0, ๊ฐ„์„ ์ด ์žˆ์œผ๋ฉด ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜, ๊ฐ„์„ ์ด ์—†์œผ๋ฉด ๋ฌดํ•œ๊ณผ ๊ฐ™์ด ์ •๋‹ต์ด ๋  ์ˆ˜ ์—†๋Š” ํฐ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
    3. ์žฅ์  : ํŠน์ • ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฅด๋‹ค.
    4. ๋‹จ์  : ๋ชจ๋“  ๊ด€๊ณ„๋ฅผ ์ €์žฅํ•˜๋ฏ€๋กœ ๋…ธ๋“œ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‚ญ๋น„๋œ๋‹ค.
  2. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ Adjacency List : ๋ฐฐ์—ด/๋ฆฌ์ŠคํŠธ๋กœ ๊ทธ๋ž˜ํ”„์˜ ๊ฐ ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„ ํ‘œํ˜„

    1. ์œ„ ๊ทธ๋ž˜ํ”„์—์„œ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๊ฐ€ ๋…ธ๋“œ์˜ ๊ฐ’์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์„ ๋•Œ, ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ ๊ฐ€๋Šฅ (2์ฐจ์›๋ฐฐ์—ด)

       let graph = [
           [1, 2],
           [0],
           [0]
       ]
    2. ์œ„ ๊ทธ๋ž˜ํ”„์—์„œ [๋…ธ๋“œ : [์ธ์ ‘๋…ธ๋“œ]] ๋กœ ์ƒ๊ฐํ–ˆ์„ ๋•Œ, ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ ๊ฐ€๋Šฅ (๋”•์…”๋„ˆ๋ฆฌ)
      (๊ทธ๋ž˜ํ”„ ํ‘œํ˜„ ๋ฐฉ์‹์—๋„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์ด์™€ ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•ด์•ผ ํ• ๋“ฏ..)

       let graph: [Int: [Int]] = [
           0 : [1, 2],
           1 : [0],
           2 : [0]
       ]
    3. ์žฅ์  : ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋งŒ์„ ์ €์žฅํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ํŠน์ • ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์ด ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ์ ๋‹ค.

    4. ๋‹จ์  : ํŠน์ • ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค. - ์—ฐ๊ฒฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ

DFS (Depth-First Search, ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)

  • ์ž์‹ ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹.
  • ๋ฉ€๋ฆฌ ์žˆ๋Š” ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜. (๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜)
  • ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ : ํ•œ ๋ฒˆ ์ฒ˜๋ฆฌํ•œ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋„๋ก ์ฒดํฌํ•˜๋Š” ๊ฒƒ.
  • ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ์— ๊ธฐ์ดˆํ•œ๋‹ค.
  • ์žฌ๊ท€๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • O(n) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค. (n = ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜)

๋™์ž‘ ๊ณผ์ •

  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ , ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค
  2. ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด, ๊ทธ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
    1. ๋งŒ์•ฝ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ฉด, ๊ฐ’์ด ๋‚ฎ์€ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ์Šคํƒ์— ์‚ฝ์ž…ํ•œ๋‹ค.
  3. ์ •๋‹ต์„ ์ฐพ๊ฑฐ๋‚˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ๊นŒ์ง€ 2.๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค.
    1. ์ •๋‹ต์„ ์ฐพ์•˜๋‹ค๋ฉด ํƒ์ƒ‰์„ ๋ฉˆ์ถ˜๋‹ค.

https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbkblwn%2FbtqRePH03Vp%2FKIuJbqhfy0tKXNBFk9hIDK%2Fimg.jpg

์˜ˆ๋ฅผ ๋“ค์–ด ์œ„ ๊ทธ๋ž˜ํ”„๋ฅผ DFS๋กœ ํƒ์ƒ‰ํ•œ๋‹ค๋ฉด,

ํƒ์ƒ‰ ์ˆœ์„œ๋Š” 1 -> 2 -> 7 -> 6 -> 8 -> 3 -> 4 -> 5 ๊ฐ€ ๋œ๋‹ค.

DFS ๊ตฌํ˜„

let graph = [
    [],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

var visited = Array(repeating: false, count: graph.count)

func dfs(graph: [[Int]], start: Int) {
    visited[start] = true // ์‹œ์ž‘์ 

    print(start, terminator: " ")

    for i in graph[start] { // ์™ผ์ชฝ๋ถ€ํ„ฐ ์ˆœํšŒ
        if !visited[i] {
            dfs(graph: graph, start: i)
        }
    }
}
// 1 2 7 6 8 3 4 5

BFS (Breadth First Search, ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)

  • ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ์šฐ์„  ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹.
  • ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜.
    • 1950๋…„ ๋ฏธ๋กœ๋ฅผ ํƒˆ์ถœํ•˜๋Š” ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ํƒ„์ƒํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  • ํ๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ •์„์ด๋‹ค.
    • ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ์œผ๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์„ ์ž…์„ ์ถœ์ด ๋˜์–ด ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋œ๋‹ค.
  • O(n) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค. (n = ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜)
  • ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ ์‹ค์ œ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ DFS๋ณด๋‹ค BFS๊ฐ€ ๋น ๋ฅธ ํŽธ์ด๋‹ค.

๋™์ž‘ ๊ณผ์ •

  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ , ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  2. ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด, ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
    1. ๋งŒ์•ฝ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ฉด, ๊ฐ’์ด ๋‚ฎ์€ ๋…ธ๋“œ or ์™ผ์ชฝ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ํ์— ์‚ฝ์ž…ํ•œ๋‹ค.
  3. ์ •๋‹ต์„ ์ฐพ๊ฑฐ๋‚˜, ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ๊นŒ์ง€ 2.๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค.
    1. ์ •๋‹ต์„ ์ฐพ์•˜๋‹ค๋ฉด ํƒ์ƒ‰์„ ๋ฉˆ์ถ˜๋‹ค.

https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbkblwn%2FbtqRePH03Vp%2FKIuJbqhfy0tKXNBFk9hIDK%2Fimg.jpg

์˜ˆ๋ฅผ ๋“ค์–ด DFS์™€ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๋ฅผ BFS๋กœ ํƒ์ƒ‰ํ•œ๋‹ค๋ฉด,

ํƒ์ƒ‰ ์ˆœ์„œ(ํ์— ๋“ค์–ด๊ฐ„ ์ˆœ์„œ)๋Š” 1 -> 2 -> 3 -> 8-> 7 -> 4 -> 5 -> 6 ์ด ๋œ๋‹ค.

BFS ๊ตฌํ˜„

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) {
    var queue = Queue<Int>()
    var visited = Array(repeating: false, count: graph.count + 1)

    queue.enqueue(start)
    visited[start] = true

    while !queue.isEmpty {
        guard let key = queue.dequeue() else { return }

        print(key, terminator: " ")
        for i in graph[key] {
            if !visited[i] {
                queue.enqueue(i)
                visited[i] = true
            }
        }
    }
}

// 1 2 3 8 7 4 5 6