JerryiOS 2023. 5. 31. 23:56

BFS(Breadth First Search)

๋‹ค์ฐจ์› ๋ฐฐ์—ด์—์„œ ๊ฐ ์นธ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ ๋„ˆ๋น„๋ฅผ ์šฐ์„ ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

๊ตฌํ˜„๋ฐฉ๋ฒ•

1. ์‹œ์ž‘ํ•˜๋Š” ์นธ์„ ํ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊น€
2. ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋‚ด์–ด ๊ทธ ์นธ์— ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ์นธ์— ๋Œ€ํ•ด 3๋ฒˆ์„ ์ง„ํ–‰
3. ํ•ด๋‹น ์นธ์„ ์ด์ „์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ , ์ฒ˜์Œ์œผ๋กœ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ํ•ด๋‹น ์นธ์„ ํ์— ์‚ฝ์ž…
4. ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ 2๋ฒˆ์„ ๋ฐ˜๋ณต
๋ชจ๋“  ์นธ์ด ํ์— 1๋ฒˆ์”ฉ ๋“ค์–ด๊ฐ€๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์นธ์ด N๊ฐœ์ผ ๋•Œ O(N).

 

์˜ˆ์‹œ์ฝ”๋“œ

import Foundation

let board: [[Int]] = [
    [1,1,1,0,1,0,0,0,0,0],
    [1,0,0,0,1,0,0,0,0,0],
    [1,1,1,0,1,0,0,0,0,0],
    [1,1,0,0,1,0,0,0,0,0],
    [0,1,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0]
]
var vis = Array(repeating: Array(repeating: false, count: 502), count: 502)
let n = 7, m = 10
let dx = [1, 0, -1, 0]
let dy = [0, 1, 0, -1]

var queue = [(Int, Int)]()
vis[0][0] = true
queue.append((0, 0))
while !queue.isEmpty {
    let cur = queue.removeFirst()
    print("(\(cur.0), \(cur.1)) ", terminator: "")
    for dir in 0..<4 {
        let nx = cur.0 + dx[dir]
        let ny = cur.1 + dy[dir]
        if nx < 0 || nx >= n || ny < 0 || ny >= m {
            continue
        }
        if vis[nx][ny] || board[nx][ny] != 1 {
            continue
        }
        vis[nx][ny] = true
        queue.append((nx, ny))
    }
}
print("")

 

์‘์šฉ 1 - ๊ฑฐ๋ฆฌ ์ธก์ •

๋‹ค์ฐจ์› ๋ฐฐ์—ด์—์„œ ๊ฑฐ๋ฆฌ ์ธก์ •์„ ํ†ตํ•ด ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ์œ ํ˜•

์ถœ์ฒ˜ : ์œ ํŠœ๋ธŒ BaaarkingDog

์ด๋Ÿฐ์‹์œผ๋กœ ๊ฑฐ๋ฆฌ๋ฅผ DFS๋กœ ์ ์–ด์„œ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•œ๋‹ค.

import Foundation

let dx: [Int] = [1, 0, -1, 0]
let dy: [Int] = [0, 1, 0, -1]

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

var board: [[String]] = []
for _ in 0..<n {
    let row = readLine()!.map { String($0) }
    board.append(row)
}

var dist: [[Int]] = Array(repeating: Array(repeating: -1, count: m), count: n)

var queue: [(Int, Int)] = []
queue.append((0, 0))
dist[0][0] = 0

while !queue.isEmpty {
    let cur = queue.removeFirst()
    
    for dir in 0..<4 {
        let nx = cur.0 + dx[dir]
        let ny = cur.1 + dy[dir]
        
        if nx < 0 || nx >= n || ny < 0 || ny >= m {
            continue
        }
        
        if dist[nx][ny] >= 0 || board[nx][ny] != "1" {
            continue
        }
        
        dist[nx][ny] = dist[cur.0][cur.1] + 1
        queue.append((nx, ny))
    }
}

print(dist[n-1][m-1] + 1)

 

์‘์šฉ2 - ์‹œ์ž‘์ ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๋•Œ

์‹œ์ž‘์ ์ด ์—ฌ๋Ÿฌ๊ฐœ์ธ ์ƒํ™ฉ์ผ ๋•Œ๋Š” ๋ชจ๋“  ์‹œ์ž‘์ ์„ ํ์— ๋„ฃ๊ณ  BFS๋ฅผ ๋Œ๋ฆฐ๋‹ค.

์ถœ์ฒ˜ : ์œ ํŠœ๋ธŒ BaaarkingDog

์˜ˆ์ œ BOJ 7576 ํ† ๋งˆํ† 

1. ๋ชจ๋“  ์‹œ์ž‘์ ์„ ์ด์ค‘ for๋ฌธ์— ๋„ฃ๊ณ  ํ์— ๋„ฃ์–ด๋‘”๋‹ค.

2. bfs๋ฅผ ๋Œ๋ฆฌ๋ฉด์„œ ๋งˆ์ง€๋ง‰ index๋ฅผ ์ €์žฅํ•ด๋‘”๋‹ค.

3. 0์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•ด์„œ ๋งŒ์•ฝ ๋ฐ”๋€Œ์ง€ ์•Š์€ ํ† ๋งˆํ† ๊ฐ€ ์žˆ๋‹ค๋ฉด -1์„ ์ถœ๋ ฅํ•˜๊ฒŒ ํ•œ๋‹ค.

import Foundation

let dx: [Int] = [1, 0, -1, 0]
let dy: [Int] = [0, 1, 0, -1]

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

var board: [[Int]] = []
var dist: [[Int]] = []
var queue: [(Int, Int)] = []

var idx = 0
var lastIdx = [0, 0]
var isCooked = true

for _ in 0..<n {
    let row = readLine()!.split(separator: " ").map { Int($0)! }
    board.append(row)
    dist.append(Array(repeating: -1, count: m))
}

for i in 0..<n {
    for j in 0..<m {
        if board[i][j] == 1 {
            queue.append((i, j))
        }
    }
}

while idx < queue.count {
    let cur = queue[idx]
    idx += 1
    
    for dir in 0..<4 {
        let nx = cur.0 + dx[dir]
        let ny = cur.1 + dy[dir]
        
        if nx<0 || nx>=n || ny<0 || ny>=m { continue }
        if board[nx][ny] == 0 {
            board[nx][ny] = 1
            queue.append((nx, ny))
            dist[nx][ny] = dist[cur.0][cur.1] + 1
            lastIdx = [nx, ny]
        }
    }
}

for i in 0..<n {
    for j in 0..<m {
        if board[i][j] == 0 {
            isCooked = false
        }
    }
}

if isCooked {
    print(dist[lastIdx[0]][lastIdx[1]]+1)
} else {
    print(-1)
}

 

์‘์šฉ3 - ์‹œ์ž‘์ ์ด ๋‘ ์ข…๋ฅ˜์ผ ๋•Œ

๋‘๊ฐ€์ง€ ์ข…๋ฅ˜์— ๋Œ€ํ•ด ๋ชจ๋‘ BFS๋ฅผ ๋Œ๋ ค์„œ ํ•ด๊ฒฐํ•œ๋‹ค. q์™€ dist๋ฅผ 2๊ฐœ์”ฉ ๋งŒ๋“ฌ

BOJ 4179 ๋ถˆ

1. ์šฐ์„  ์ง€ํ›ˆ์ด๋Š” ์‹ ๊ฒฝ์“ฐ์ง€๋ง๊ณ  ๋ถˆ์— ๋Œ€ํ•œ BFS๋ฅผ ๋Œ๋ ค์„œ ๋ฏธ๋ฆฌ ๊ฐ ์นธ์— ๋ถˆ์ด ์ „ํŒŒ๋˜๋Š” ์‹œ๊ฐ„์„ ๊ตฌํ•œ๋‹ค.

2. ์ง€ํ›ˆ์ด์— ๋Œ€ํ•œ BFS๋ฅผ ๋Œ๋ฆฌ๋ฉฐ ์ง€ํ›ˆ์ด๋ฅผ ์ด๋™์‹œํ‚จ๋‹ค.

import Foundation

let dx = [1, 0, -1, 0]
let dy = [0, 1, 0, -1]

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

var board = [[String]]()
var dist1 = Array(repeating: Array(repeating: -1, count: m), count: n) // ๋ถˆ์˜ ์ „ํŒŒ ์‹œ๊ฐ„
var dist2 = Array(repeating: Array(repeating: -1, count: m), count: n) // ์ง€ํ›ˆ์ด์˜ ์ด๋™ ์‹œ๊ฐ„

for _ in 0..<n {
    let line = readLine()!.map { String($0) }
    board.append(line)
}

var q1 = [(Int, Int)]()
var q2 = [(Int, Int)]()

for i in 0..<n {
    for j in 0..<m {
        if board[i][j] == "F" {
            q1.append((i, j))
            dist1[i][j] = 0
        }
        if board[i][j] == "J" {
            q2.append((i, j))
            dist2[i][j] = 0
        }
    }
}

// ๋ถˆ์— ๋Œ€ํ•œ BFS
var q1Idx = 0
while q1Idx < q1.count {
    let cur = q1[q1Idx]
    q1Idx += 1
    for dir in 0..<4 {
        let nx = cur.0 + dx[dir]
        let ny = cur.1 + dy[dir]
        if nx < 0 || nx >= n || ny < 0 || ny >= m {
            continue
        }
        if dist1[nx][ny] >= 0 || board[nx][ny] == "#" {
            continue
        }
        dist1[nx][ny] = dist1[cur.0][cur.1] + 1
        q1.append((nx, ny))
    }
}

// ์ง€ํ›ˆ์ด์— ๋Œ€ํ•œ BFS
var q2Idx = 0
while q2Idx < q2.count {
    let cur = q2[q2Idx]
    q2Idx += 1
    for dir in 0..<4 {
        let nx = cur.0 + dx[dir]
        let ny = cur.1 + dy[dir]
        if nx < 0 || nx >= n || ny < 0 || ny >= m {
            // ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๋‹ค๋Š” ๊ฒƒ์€ ํƒˆ์ถœ์— ์„ฑ๊ณตํ–ˆ๋‹ค๋Š” ์˜๋ฏธ. ํ์— ๊ฑฐ๋ฆฌ ์ˆœ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฏ€๋กœ ์ตœ์ดˆ์— ํƒˆ์ถœํ•œ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•˜๋ฉด ๋จ.
            print(dist2[cur.0][cur.1] + 1)
            exit(0)
        }
        if dist2[nx][ny] >= 0 || board[nx][ny] == "#" {
            continue
        }
        // ๋ถˆ์ด ์ง€๋‚˜๊ฐ„ ์‹œ๊ฐ„์ด ์ง€ํ›ˆ์ด๊ฐ€ ์ง€๋‚˜๊ฐˆ ์‹œ๊ฐ„๋ณด๋‹ค ์ž‘์•„์•ผํ•จ
        if dist1[nx][ny] != -1 && dist1[nx][ny] <= dist2[cur.0][cur.1] + 1 {
            continue
        }
        dist2[nx][ny] = dist2[cur.0][cur.1] + 1
        q2.append((nx, ny))
    }
}

print("IMPOSSIBLE") // ์—ฌ๊ธฐ์— ๋„๋‹ฌํ–ˆ๋‹ค๋Š” ๊ฒƒ์€ ํƒˆ์ถœ์— ์‹คํŒจํ–ˆ์Œ์„ ์˜๋ฏธ.

 

์‘์šฉ4 - 1์ฐจ์›์—์„œ์˜ BFS

2์ฐจ์› ๋ฐฐ์—ด์—์„œ ์ƒํ•˜์ขŒ์šฐ๋กœ ๋ฐฉํ–ฅ์„ ๋‘์—ˆ๋“ฏ์ด ๋ฌธ์ œ ์กฐ๊ฑด์— ๋”ฐ๋ผ BFS๋ฅผ ๋Œ๋ ค์„œ ํ•ด๊ฒฐํ•œ๋‹ค.

BOJ 1697 ์ˆจ๋ฐ”๊ผญ์งˆ

 

1. 0~ 100002 ์‚ฌ์ด์˜ dist๋ฐฐ์—ด์„ -1์„ ๋„ฃ์–ด ์ƒ์„ฑํ•œ๋‹ค.
2. dist[N]์˜ ์ดˆ๊ธฐ๊ฐ’์„ 0์œผ๋กœ ๋„ฃ์–ด์ค€๋‹ค. (์ˆ˜๋นˆ์ด๊ฐ€ ์ถœ๋ฐœํ•˜๋Š” ์‹œ๊ฐ„ ์ €์žฅ)
3. ๋™์ƒ์„ ์ฐพ์€ ์‹œ๊ฐ„์ด ๋„ฃ์–ด์ ธ์„œ -1์ด ์—†์–ด์งˆ๋•Œ๊นŒ์ง€ BFS๋ฅผ ๋Œ๋ฆฐ๋‹ค.

 

import Foundation

let NK = readLine()!.split(separator: " ").map { Int($0)! }
let N = NK[0]
let K = NK[1]

var dist = Array(repeating: -1, count: 100002)

var idx = 0
var queue = [N]
dist[N] = 0
while dist[K] == -1 {
    let cur = queue[idx]
    idx += 1
    
    let nxtArr = [cur-1, cur+1, cur*2]
    for nxt in nxtArr {
        if nxt<0 || nxt > 100000 { continue }
        if dist[nxt] != -1 { continue }
        dist[nxt] = dist[cur] + 1
        queue.append(nxt)
    }
}

print(dist[K])

 

 

๋ฐ˜์‘ํ˜•