Swift Data Structure And Algorithm/Tree

ํŠธ๋ฆฌ์—์„œ์˜ ๊ฑฐ๋ฆฌ

youngjaeLee1026 2022. 4. 7. 00:14

1. ๋ฌธ์ œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-07 00 13 14

2. ์ž…์ถœ๋ ฅ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-07 00 13 21

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

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-07 00 13 29

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

  • ํŠน์ • ๋…ธ๋“œ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด, ํŠน์ • ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Œ
  • ๋”ฐ๋ผ์„œ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ๋ชจ๋“  ๋ถ€๋ชจ ์ž์‹ ๊ด€๊ณ„์˜ ๋…ธ๋“œ๋Š” ์„œ๋กœ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ด์–ด์ฃผ๊ณ , X ๋…ธ๋“œ์—์„œ ๋ถ€ํ„ฐ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ
  • ๋ณ„๋„์˜ ๋ฐฐ์—ด์— ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ

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

//MARK: - ํŠธ๋ฆฌ์—์„œ์˜ ๊ฑฐ๋ฆฌ

//MARK: - Framework
import Foundation

//MARK: - Type
struct Node {
    //MARK: - Property
    private var edges: [Int]
    
    //MARK: - initializer
    init() {
        self.edges = []
    }
    
    //MARK: - Method
    mutating func push(_ data: Int) -> Void {
        self.edges.append(data)
    }
    
    func getNodeData(_ index: Int) -> Int {
        return self.edges[index]
    }
    
    func size() -> Int {
        return self.edges.count
    }
}

//MARK: - Function
func dfs(_ tree: [Node], _ visited: inout [Bool], _ levels: inout [Int], _ node: Int, _ currentLevel: Int) -> Void {
    visited[node] = true
    levels[node] = currentLevel
    
    for i in 0..<tree[node].size() {
        let y: Int = tree[node].getNodeData(i)
        
        if !visited[y] {
            dfs(tree, &visited, &levels, y, currentLevel + 1)
        }
    }
}

func solution() -> Void {
    //MARK: - Input
    guard let input: [String] = readLine()?.components(separatedBy: " ") else { return }
    
    let n: Int = input.map { Int($0) }[0] ?? 0
    let X: Int = input.map { Int($0) }[1] ?? 0
    let Y: Int = input.map { Int($0) }[2] ?? 0
    
    var tree: [Node] = Array(repeating: Node(), count: n + 10)
    var visited: [Bool] = Array(repeating: false, count: n + 10)
    var levels: [Int] = Array(repeating: 0, count: n + 10)
    var distance: Int = 0
    
    for _ in 0..<n - 1 {
        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
        
        tree[a].push(b)
        tree[b].push(a)
    }
    
    //MARK: - Process
    dfs(tree, &visited, &levels, X, 0)
    distance = levels[Y]
    
    //MARK: - Output
    print(distance)
}
solution()

 

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