Swift Data Structure And Algorithm/Graph Algorithm

๊ทธ๋ž˜ํ”„ ๊ตฌํ˜„ : ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

youngjaeLee1026 2022. 4. 14. 16:06

1. ๋ฌธ์ œ

  • ๊ทธ๋ž˜ํ”„ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„

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

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

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

//MARK: - ๊ทธ๋ž˜ํ”„ ๊ตฌํ˜„ : ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

//MARK: - Framework
import Foundation

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

//MARK: - Function
func isConnected(_ myGraph: [Graph], _ x: Int, _ y: Int) -> Bool {
    //Time Complexity : O(dgree(x))
    var result: Bool = false
    
    for i in 0..<myGraph[x].edges.count {
        if myGraph[x].edges[i] == y {
            result = true
            break
        }
    }
    
    return result
}

func getNodeList(_ myGraph: [Graph], _ x: Int) -> Void {
    //Time Complexity : O(dgree(x))
    var answer: String = ""
    
    for i in 0..<myGraph[x].edges.count - 1 {
        answer += "\(myGraph[x].edges[i]) "
    }
    answer += "\(myGraph[x].edges[myGraph[x].edges.count - 1])"
    
    print(answer)
}

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
    var myGraph: [Graph] = Array(repeating: Graph(), count: n + 10)
    
    //MARK: - Process
    for _ in 0..<m {
        guard let inputData: [String] = readLine()?.components(separatedBy: " ") else { return }
        let a: Int = inputData.map { Int($0) }[0] ?? 0
        let b: Int = inputData.map { Int($0) }[1] ?? 0
        
        myGraph[a].edges.append(b)
        myGraph[b].edges.append(a)
    }
    
    //MARK: - Output
    print(isConnected(myGraph, 1, 2))   //true
    print(isConnected(myGraph, 1, 3))   //true
    print(isConnected(myGraph, 1, 4))   //true
    print(isConnected(myGraph, 1, 5))   //false
    
    getNodeList(myGraph, 5) //3 4
}
solution()

 

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