๐Ÿ“ Algorithm/์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] 02. BFS์™€ DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ผˆ๋Œ€ with Swift

JINiOS 2023. 12. 28. 20:00
728x90

BFS(๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰)

1. removeFirst() ์‚ฌ์šฉ

func bfs(graph: [[Int]], startX: Int, startY: Int) -> [Int] {
    var visited = Array(repeating: Array(repeating: false, count: n), count: n)
    var queue = [(startX, startY)]
    var result = [Int]()
    
    visited[startX][startY] = true
    
    while let node = queue.isEmpty ? nil : queue.removeFirst() {
        let x = node.0
        let y = node.1
        
        result.append(graph[x][y])
        
        let dx = [0, 0, 1, -1]
        let dy = [1, -1, 0, 0]
        
        for i in 0..<4 {
            let nx = x + dx[i]
            let ny = y + dy[i]
            
            if nx < 0 || ny < 0 || nx >= n || ny >= n || visited[nx][ny] {
                continue
            }
            
            visited[nx][ny] = true
            queue.append((nx, ny))
        }
    }
    
    return result
}

 

2. ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผ

removeFirst()๋กœ ์ธํ•œ ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ํ”ผํ•˜๋ ค๋ฉด ์ธ๋ฑ์Šค๋กœ ํ๋ฅผ ์ˆœํšŒํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋ฐฑ์ค€ ๋ฌธ์ œ

var idx = 0

while idx < queue.count {
    let now = queue[idx]
    idx += 1
    
    for i in 0..<N {
        ...
        queue.append(n)
		....
	}
}

 

 

3. ์ด๋™ ํšŸ์ˆ˜๋ฅผ ์นด์šดํŠธํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ

๋ฐฑ์ค€ ๋ฌธ์ œ

var queue: [(Int, Int)] = [st]
var nxt_queue: [(Int, Int)] = []

func move() {
    for q in queue {
        for i in 0..<4 {
            let nx = q.0 + dx[i]
            let ny = q.1 + dy[i]
            
            if 0 > nx || nx >= R || 0 > ny || ny >= C {
                success = true
            } else {
                if map[nx][ny] == "#" || map[nx][ny] == "F" || map[nx][ny] == "J" { continue } // ๋„˜์–ด๊ฐ€๋Š” ์กฐ๊ฑด
                map[nx][ny] = "J"
                nxt_queue.append((nx, ny))
            }
        }
    }
}

while true {
    nxt_queue = [] // ์ƒˆ๋กœ ์ €์žฅํ•  ํ ์ดˆ๊ธฐํ™”

    if queue.isEmpty {
        print("IMPOSSIBLE")
        break
    }
   
    time += 1

    move()
    
    if success {
        print(time)
        break
    }
    queue = nxt_queue // ๋‹ค์Œ ์ˆœํšŒํ•  ํ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ
}

 

 

DFS(๊นŠ์ด์šฐ์„ ํƒ์ƒ‰)

func dfs(graph: [[Int]], startX: Int, startY: Int) -> [Int] {
    var visited = Array(repeating: Array(repeating: false, count: n), count: n)
    var stack = [(startX, startY)]
    var result = [Int]()
    
    visited[startX][startY] = true
    
    while let node = stack.isEmpty ? nil : stack.removeLast() {
        let x = node.0
        let y = node.1
        
        result.append(graph[x][y])
        
        let dx = [0, 0, 1, -1]
        let dy = [1, -1, 0, 0]
        
        for i in 0..<4 {
            let nx = x + dx[i]
            let ny = y + dy[i]
            
            if nx < 0 || ny < 0 || nx >= n || ny >= n || visited[nx][ny] {
                continue
            }
            
            visited[nx][ny] = true
            stack.append((nx, ny))
        }
    }
    
    return result
}

 

 

์œ„์˜ ์ฝ”๋“œ์—์„œ BFS๋Š” ํ(Queue)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๊ณ , DFS๋Š” ์Šคํƒ(Stack)์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ์—์„œ ํฐ ์ฐจ์ด๋Š” queue.removeFirst(), stack.removeLast()๋ผ๊ณ  ๋ณด๋ฉด ์ข‹์„ ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค.

 

BFS๋Š” ์‹œ์ž‘์ ์—์„œ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ๋จผ์ € ํƒ์ƒ‰ํ•˜๊ณ , ๊ทธ ๋‹ค์Œ์— ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋˜๋ฉฐ,

DFS๋Š” ํ•œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ ํ›„์—๋Š” ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ํƒ์ƒ‰ํ•˜๊ณ , ๊ทธ ๋‹ค์Œ์— ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

 

BFS๋Š” ํƒ์ƒ‰ํ•  ์˜์—ญ์ด ๋ณต์žกํ•˜๊ฑฐ๋‚˜, ํƒ์ƒ‰ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋˜๊ณ , DFS๋Š” ํƒ์ƒ‰ํ•  ์˜์—ญ์ด ๊ฐ„๋‹จํ•˜๊ฑฐ๋‚˜, ํƒ์ƒ‰ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

728x90