Swift Data Structure And Algorithm/Graph Algorithm

์ด๋ถ„ ๊ทธ๋ž˜ํ”„ ํŒ๋ณ„_BFS

youngjaeLee1026 2022. 4. 15. 13:17

1. ๋ฌธ์ œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-15 13 05 04

2. ์ž…์ถœ๋ ฅ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-15 13 05 13

3. ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-15 13 05 25

4. ๋ฌธ์ œ ์„ค๊ณ„

  • ๊ทธ๋ž˜ํ”„์˜ ๊ฐ™์€ ์ง‘ํ•ฉ์˜ ๋…ธ๋“œ์— ๊ฐ„์„ ์ด ์กด์žฌํ•˜๋Š”์ง€ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ํƒ์ƒ‰ํ•ด ๋ด์•ผ ํ•จ
  • ๋”ฐ๋ผ์„œ ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰์„ ํ†ตํ•ด ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ , ์—ฌ๊ธฐ์„œ ๊ฐ™์€ ์ง‘ํ•ฉ์ธ์ง€ ์•„๋‹Œ์ง€๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ
  • ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋งˆ๋‹ค ๊ทธ๋ฃน(0 ํ˜น์€ 1)์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฐ์—ด์„ ํ†ตํ•ด ๊ฐ™์€ ์ง‘ํ•ฉ์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ
  • ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ, ํ˜„์žฌ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์˜ ๊ทธ๋ฃน์ด 1์ด๋ผ๋ฉด 0์„, 0์ด๋ผ๋ฉด 1์„ ๋ถ€์—ฌํ•จ์œผ๋กœ์จ ์ง‘ํ•ฉ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ ,
  • ์—ฌ๊ธฐ์„œ ๊ฐ™์€ ์ง‘ํ•ฉ์ด๋ผ๋ฉด, ๋…ธ๋“œ๋ผ๋ฆฌ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘์— ๊ทธ๋ฃน์ด ๊ฐ™์€ ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด
  • ์ด๋ถ„ ๊ทธ๋ž˜ํ”„๊ฐ€ ๋  ์ˆ˜ ์—†์Œ. ๋”ฐ๋ผ์„œ O(N + M)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ

5. ์ „์ฒด ์ฝ”๋“œ

//MARK: - ์ด๋ถ„ ๊ทธ๋ž˜ํ”„ ํŒ๋ณ„ - BFS

//MARK: - Framework
import Foundation

//MARK: - Type
struct Graph {
    //MARK: - Property
    var edges: [Int]
    
    //MARK: - Initializer
    init() {
        self.edges = []
    }
}

//MARK: - Variable
var graph: [Graph] = []
var visited: [Bool] = []
var groups: [Int] = []

//MARK: - Function
func bfs(_ start: Int) -> Bool {
    var result: Bool = true
    var queue: [Int] = []
    queue.append(start)
    visited[start] = true
    
    while !queue.isEmpty {
        let current: Int = queue.removeFirst()
        
        for i in stride(from: 0, to: graph[current].edges.count, by: 1) {
            let next: Int = graph[current].edges[i]
            
            if !visited[next] {
                visited[next] = true
                queue.append(next)
                groups[next] = groups[current] == 0 ? 1 : 0
            } else {
                if groups[next] == groups[current] {
                    result = false
                    break
                }
            }
        }
        
        if !result {
            break
        }
    }
    
    return result
}

func solution() -> Void {
    //MARK: - Input
    guard let input: [String] = readLine()?.components(separatedBy: " ") else { return }
    let N: Int = input.map { Int($0) }[0] ?? 0
    let M: Int = input.map { Int($0) }[1] ?? 0
    graph = Array(repeating: Graph(), count: N + 10)
    visited = Array(repeating: false, count: N + 10)
    groups = Array(repeating: 0, count: N + 10)
    
    for _ in 0..<M {
        guard let data: [String] = readLine()?.components(separatedBy: " ") else { return }
        let a: Int = data.map { Int($0) }[0] ?? 0
        let b: Int = data.map { Int($0) }[1] ?? 0
        
        graph[a].edges.append(b)
        graph[b].edges.append(a)
    }
    
    //MARK: - Process & Output
    print(bfs(1) ? "Yes" : "No")
}
solution()

 

์ „์ฒด์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.