[Swift - ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 섬 μ—°κ²°ν•˜κΈ°

2021. 6. 7. 18:47γ†πŸ§‘πŸ»‍πŸ’» iOS 개발/Swift - Algorithm - Solutions

πŸ•΅πŸ»  λ¬Έμ œ 해석 


n개의 섬 사이에 닀리λ₯Ό κ±΄μ„€ν•˜λŠ” λΉ„μš©(costs)이 μ£Όμ–΄μ§ˆ λ•Œ, μ΅œμ†Œμ˜ λΉ„μš©μœΌλ‘œ λͺ¨λ“  섬이 μ„œλ‘œ 톡행 κ°€λŠ₯ν•˜λ„λ‘ λ§Œλ“€ λ•Œ ν•„μš”ν•œ μ΅œμ†Œ λΉ„μš©μ„ return ν•˜λ„λ‘ solution을 μ™„μ„±ν•˜μ„Έμš”.

μ œν•œμ‚¬ν•­

  • μ„¬μ˜ 개수 n은 1 이상 100 μ΄ν•˜μž…λ‹ˆλ‹€.
  • costs의 κΈΈμ΄λŠ” ((n-1) * n) / 2 μ΄ν•˜μž…λ‹ˆλ‹€.
  • μž„μ˜μ˜ i에 λŒ€ν•΄, costs[i][0] 와 costs[i] [1]μ—λŠ” 닀리가 μ—°κ²°λ˜λŠ” 두 μ„¬μ˜ λ²ˆν˜Έκ°€ λ“€μ–΄μžˆκ³ , costs[i] [2]μ—λŠ” 이 두 섬을 μ—°κ²°ν•˜λŠ” 닀리λ₯Ό 건섀할 λ•Œ λ“œλŠ” λΉ„μš©μž…λ‹ˆλ‹€.
  • 같은 연결은 두 번 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€. λ˜ν•œ μˆœμ„œκ°€ λ°”λ€Œλ”λΌλ„ 같은 μ—°κ²°λ‘œ λ΄…λ‹ˆλ‹€
  • λͺ¨λ“  섬 μ‚¬μ΄μ˜ 닀리 건섀 λΉ„μš©μ΄ 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€. 이 경우, 두 섬 μ‚¬μ΄μ˜ 건섀이 λΆˆκ°€λŠ₯ν•œ κ²ƒμœΌλ‘œ λ΄…λ‹ˆλ‹€.
  • μ—°κ²°ν•  수 μ—†λŠ” 섬은 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.

 

πŸ€” 풀이 κ³Όμ •


섬과 섬을 μ—°κ²°ν•˜λŠ” 닀리λ₯Ό 놓아 λͺ¨λ“  섬이 μ΅œμ†Œ λΉ„μš©μœΌλ‘œ 연결될 수 μžˆλ„λ‘ ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€. 즉, MST(Minimum Spanning Tree) λ¬Έμ œμΈλ°μš”. κ·Έλž˜ν”„ μ΄λ‘ μ—μ„œ Spannig TreeλŠ” λͺ¨λ“  λ…Έλ“œλ₯Ό μ—°κ²°ν•˜λŠ” λΆ€λΆ„ κ·Έλž˜ν”„λΌκ³  ν‘œν˜„ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ·Έλž˜ν”„ 쀑 μ΅œμ†Œ λΉ„μš©μœΌλ‘œ λͺ¨λ“  λ…Έλ“œλ₯Ό μ—°κ²°ν•œ λΆ€λΆ„ κ·Έλž˜ν”„λ₯Ό MST라고 λΆ€λ¦…λ‹ˆλ‹€. 이 MSTλŠ” ν”„λ¦Ό μ•Œκ³ λ¦¬μ¦˜μ΄λ‚˜ 크루슀칼 μ•Œκ³ λ¦¬μ¦˜μ„ 톡해 λ‹€ν•­ μ‹œκ°„ μ•ˆμ— 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

μ €λŠ” ν”„λ¦Ό μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. κ·Έλž˜ν”„λŠ” 인접 ν–‰λ ¬ ν˜•νƒœλ‘œ κ΅¬ν˜„ν•˜κ³  0번째 섬을 μ‹œμž‘μ μœΌλ‘œ μ΅œμ†Œ νž™μ— μΈμ ‘ν•œ 섬듀과 λΉ„μš©μ„ νŠœν”Œλ‘œ λ¬Άμ–΄ λ„£μ–΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. μ΅œμ†Œ λΉ„μš© κ°„μ„ μœΌλ‘œ ν¬ν•¨λœ 섬듀을 λ”°λ‘œ 집합을 μ΄μš©ν•˜μ§€ μ•Šκ³  tree 배열을 톡해 μ²΄ν¬ν•΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. μ΅œμ†Œ νž™μ˜ 경우 λ”°λ‘œ κ΅¬ν˜„ν•˜μ§€ μ•Šκ³  배열을 μ΄μš©ν•˜μ—¬ 맀번 μ •λ ¬ν•΄μ£ΌλŠ” λ°©μ‹μœΌλ‘œ ν•΄κ²°ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

ν”„λ¦Ό μ•Œκ³ λ¦¬μ¦˜κ³Ό ν¬λ£¨μŠ€μΉΌμ•Œκ³ λ¦¬μ¦˜μ€ λ”°λ‘œ μ •λ¦¬ν•˜μ—¬ μ•Œκ³ λ¦¬μ¦˜ ν¬μŠ€νŒ…μœΌλ‘œ μ˜¬λ €λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. πŸ˜„

 

πŸ“¦  λ¬Έμ œ 풀이 & μ½”λ“œ


import Foundation

func solution(_ n:Int, _ costs:[[Int]]) -> Int {
    var graph = [[Int]](repeating: [Int](repeating: 0, count: n), count: n)
    var tree = [Bool](repeating: false, count: n)
    var mstCost = 0
    // μ΅œμ†Œνž™μ—­ν•  λ°°μ—΄
    var pq: [(cost: Int, idx: Int)] = []
    
    for info in costs {
        let from = info[0]
        let to = info[1]
        let cost = info[2]
        
        graph[from][to] = cost
        graph[to][from] = cost
    }
    
    // 0번째 섬을 μ‹œμž‘μ μœΌλ‘œ ν•˜κ³  νŠΈλ¦¬μ— λ„£μ–΄μ€€ λ’€ 
    // μ΅œμ†Œνž™μ— μΈμ ‘ν•œ μ„¬μ˜ μ—°κ²°λΉ„μš©κ³Ό μ„¬μ˜ 인덱슀λ₯Ό λ„£μ–΄μ€€λ‹€.
    
    tree[0] = true
    
    for idx in 0..<n {
        if graph[0][idx] != 0 {
            pq.append((graph[0][idx], idx))
        }
    }
    
    while !pq.isEmpty {
        // λΉ„μš©μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬
        pq.sort{$0.cost < $1.cost}
        
        let cur = pq.first!.idx
        let curCost = pq.first!.cost
        
        pq.removeFirst()
        
        // tree에 ν¬ν•¨λ˜μ–΄μžˆμ§€ μ•Šλ‹€λ©΄ μΆ”κ°€ν•˜κ³  μ΅œμ†Œνž™μ— μΈμ ‘ν•œ 섬듀을 λ„£μ–΄μ€€λ‹€.
        
        if tree[cur] == false {
            tree[cur] = true
            // μ΅œμ†Œ λΉ„μš© μΆ”κ°€
            mstCost += curCost
            for idx in 0..<n {
                if tree[idx] == false && graph[cur][idx] != 0 {
                    pq.append((graph[cur][idx], idx))
                }
            }
        }
    }
    
    return mstCost
}
 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - 섬 μ—°κ²°ν•˜κΈ°

4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4

programmers.co.kr

 

πŸ‘πŸ»  μ°Έκ³