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

[Swift] BFS ์˜ˆ์ œ์™€ ํ’€์ด (๋ฐฑ์ค€ 2178 ๋ฏธ๋กœ ํƒ์ƒ‰) ๋ณธ๋ฌธ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด Swift

[Swift] BFS ์˜ˆ์ œ์™€ ํ’€์ด (๋ฐฑ์ค€ 2178 ๋ฏธ๋กœ ํƒ์ƒ‰)

๋น„๋น„ bibi 2023. 1. 16. 23:05

[Swift] BFS ์˜ˆ์ œ์™€ ํ’€์ด (๋ฏธ๋กœ ํƒ์ƒ‰)

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

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

๋™์ž‘ ๊ณผ์ •

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

์˜ˆ์ œ - ๋ฐฑ์ค€ 2178 ๋ฏธ๋กœ ํƒ์ƒ‰

2178๋ฒˆ: ๋ฏธ๋กœ ํƒ์ƒ‰

๋ฌธ์ œ

N×Mํฌ๊ธฐ์˜ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„๋˜๋Š” ๋ฏธ๋กœ๊ฐ€ ์žˆ๋‹ค.

๋ฏธ๋กœ์—์„œ 1์€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์„ ๋‚˜ํƒ€๋‚ด๊ณ , 0์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ์นธ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฏธ๋กœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, (1, 1)์—์„œ ์ถœ๋ฐœํ•˜์—ฌ (N, M)์˜ ์œ„์น˜๋กœ ์ด๋™ํ•  ๋•Œ ์ง€๋‚˜์•ผ ํ•˜๋Š” ์ตœ์†Œ์˜ ์นธ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ํ•œ ์นธ์—์„œ ๋‹ค๋ฅธ ์นธ์œผ๋กœ ์ด๋™ํ•  ๋•Œ, ์„œ๋กœ ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์ œ1์—์„œ๋Š” 15์นธ์„ ์ง€๋‚˜์•ผ (N, M)์˜ ์œ„์น˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ์นธ์„ ์…€ ๋•Œ์—๋Š” ์‹œ์ž‘ ์œ„์น˜์™€ ๋„์ฐฉ ์œ„์น˜๋„ ํฌํ•จํ•œ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋‘ ์ •์ˆ˜ N, M(2 ≤ N, M ≤ 100)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” M๊ฐœ์˜ ์ •์ˆ˜๋กœ ๋ฏธ๋กœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ๊ฐ์˜ ์ˆ˜๋“ค์€ ๋ถ™์–ด์„œ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ง€๋‚˜์•ผ ํ•˜๋Š” ์ตœ์†Œ์˜ ์นธ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ํ•ญ์ƒ ๋„์ฐฉ์œ„์น˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ 1

4 6
101111
101010
101011
111011

์˜ˆ์ œ ์ถœ๋ ฅ 1

15

์˜ˆ์ œ ์ž…๋ ฅ 2

4 6
110110
110110
111111
111101

์˜ˆ์ œ ์ถœ๋ ฅ 2

9

ํ’€์ด

let inputArr = readLine()!.split(separator: " ").map { Int($0)! }
let n = inputArr[0]
let m = inputArr[1]

var maze = [[Int]]()

for _ in (0..<n) { // ๋ฏธ๋กœ๋ฅผ ์ด์ฐจ์›๋ฐฐ์—ด์— ์ž…๋ ฅ
    let innerArr = readLine()!.map { Int(String($0))! }
    maze.append(innerArr)
}

var queue = [(0,0)] // ํ์— ๋ฏธ๋กœ์˜ ์‹œ์ž‘์ ์„ ๋„ฃ๊ณ  ์‹œ์ž‘

let dx = [-1, 1, 0, 0] // ์ƒํ•˜์ขŒ์šฐ 1์นธ์”ฉ ์ด๋™ํ•  ๋–„์˜ x์ขŒํ‘œ, y์ขŒํ‘œ
let dy = [0, 0, -1, 1]

while !queue.isEmpty { // ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    let (x, y) = queue.removeFirst()

    for i in (0..<4) { // xy์˜ ์ƒํ•˜์ขŒ์šฐ์— ๋Œ€ํ•ด
        let nx = x + dx[i] // x์ขŒํ‘œ, y์ขŒํ‘œ ์ด๋™
        let ny = y + dy[i]

                // x ๋˜๋Š” y ์ขŒํ‘œ๊ฐ€ ๋ฏธ๋กœ๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์ด๋™x
        if nx < 0 || ny < 0 || nx >= n || ny >= m {
            continue
        }
                // xy ์ขŒํ‘œ ์ด๋™ ์‹œ ๋ฒฝ(0)์„ ๋งŒ๋‚˜๋ฉด ์ด๋™x
        if maze[nx][ny] == 0 {
            continue
        }
                // xy ์ขŒํ‘œ ์ด๋™ ํ›„ ํ†ต๋กœ(1)๋ฅผ ๋งŒ๋‚˜๋ฉด ์ด๋™
        if maze[nx][ny] == 1 {
            maze[nx][ny] = maze[x][y] + 1
            queue.append((nx, ny))
        }
    }
}
print(maze[n-1][m-1])

์œ„์™€ ๊ฐ™์ด ํ’€๋ฉด ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ๋งˆ๋‹ค ์ด๋™ ์ „ ์œ„์น˜์˜ ๊ฐ’+1์„ ์ด๋™ ํ›„ ์œ„์น˜์˜ ๊ฐ’์œผ๋กœ ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฏธ๋กœ์˜ ์ขŒํ‘œ ๊ฐ’์€ ๋ชจ๋“  ์‹œํ–‰์ด ๋๋‚˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ๋ชจ์Šต์ด ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๋งจ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜(์ถœ๊ตฌ) ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ์ด๋™ํ•œ ์นธ์ˆ˜๊ฐ€ ๋œ๋‹ค(15).

[0, 0, 0, 0, 0], // ์ด๋™ ์ „
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
โฌ‡๏ธ
[3, 0, 9, 10, 11, 12], // ์ด๋™ ํ›„
[2, 0, 8, 0, 12, 0], 
[3, 0, 7, 0, 13, 14], 
[4, 5, 6, 0, 14, 15]

BFS์˜ ํ•ต์‹ฌ์€ ํ์— ์ž‘์—…๋ชฉ๋ก์„ ๋„ฃ๊ณ , ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ํ˜„์žฌ ์œ„์น˜์˜ ์ฃผ๋ณ€์„ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

์Šคํƒ์„ DFS์™€ ๋‹ฌ๋ฆฌ ํ๋ฅผ ์“ฐ๊ธฐ ๋•Œ๋ฌธ์—, ํ์— ์ž…๋ ฅ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ด๋™์ด ์ฒ˜๋ฆฌ๋œ๋‹ค.