λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⌨️ Language/swift

[Swift] μš°μ„ μˆœμœ„ 큐(Priority Queue) κ΅¬ν˜„ν•˜κΈ°

by hyebin (Helia) 2024. 9. 27.
λ°˜μ‘ν˜•

μš°μ„ μˆœμœ„ νλŠ” μš”μ†Œκ°€ μ‚½μž…λ  λ•Œλ§ˆλ‹€ μš°μ„ μˆœμœ„μ— 따라 μ •λ ¬λ˜λ©°, κ°€μž₯ 높은 μš°μ„ μˆœμœ„μ˜ μš”μ†Œκ°€ λ¨Όμ € μ²˜λ¦¬λ©λ‹ˆλ‹€.

 

이전에 κ΅¬ν˜„ν•œ Heap을 μ‚¬μš©ν•˜μ—¬ μš°μ„ μˆœμœ„ 큐λ₯Ό μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜λŠ” PriorityQueue ꡬ쑰체λ₯Ό μ œλ„€λ¦­μœΌλ‘œ μ •μ˜ν•œ μ½”λ“œμž…λ‹ˆλ‹€.

struct PriorityQueue<T> {
    private var heap: Heap<T>

    var isEmpty: Bool {
        return heap.isEmpty
    }

    var count: Int {
        return heap.count
    }

    var peek: T? {
        return heap.peek
    }
    
    init(sort: @escaping (T, T) -> Bool) {
        heap = Heap(priorityFunction: sort)
    }

    mutating func enqueue(_ element: T) {
        heap.push(element)
    }

    mutating func dequeue() -> T? {
        return heap.pop()
    }
}

 

μœ„ μ½”λ“œμ—μ„œλŠ” μš°μ„ μˆœμœ„ νμ˜ κΈ°λ³Έ λ™μž‘을 κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

 

 

  • enqueue(_:): μš°μ„ μˆœμœ„ 큐에 μƒˆ μš”μ†Œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€. μ‹œκ°„ λ³΅μž‘λ„λŠ” O(log n)μž…λ‹ˆλ‹€.
  • dequeue(): κ°€μž₯ 높은 μš°μ„ μˆœμœ„μ˜ μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  λ°˜ν™˜ν•©λ‹ˆλ‹€. μ‹œκ°„ λ³΅μž‘λ„λŠ” O(log n)μž…λ‹ˆλ‹€.

 

μš°μ„ μˆœμœ„ νλŠ” μ΅œμ†Œ μš°μ„ μˆœμœ„ 큐와 μ΅œλŒ€ μš°μ„ μˆœμœ„ 큐둜 λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΅œμ†Œ μš°μ„ μˆœμœ„ νλŠ” μˆ«μžκ°€ μž‘μ„μˆ˜λ‘ μš°μ„ μˆœμœ„κ°€ λ†’κ³ , μ΅œλŒ€ μš°μ„ μˆœμœ„ νλŠ” μˆ«μžκ°€ 클수둝 μš°μ„ μˆœμœ„κ°€ λ†’μŠ΅λ‹ˆλ‹€.

 

 

μ΅œμ†Œ μš°μ„ μˆœμœ„ 큐 

var priorityQueue = PriorityQueue<Int>(sort: <)

// μš”μ†Œ μ‚½μž…
priorityQueue.enqueue(5)
priorityQueue.enqueue(1)
priorityQueue.enqueue(3)
priorityQueue.enqueue(2)

// κ°€μž₯ μš°μ„ μˆœμœ„κ°€ 높은 μš”μ†Œ(μ΅œμ†Œκ°’) 확인
print(priorityQueue.peek!) // 1

// μš”μ†Œ 제거
print(priorityQueue.dequeue()!) // 1
print(priorityQueue.dequeue()!) // 2
print(priorityQueue.dequeue()!) // 3
print(priorityQueue.dequeue()!) // 5

 

μ΅œλŒ€ μš°μ„ μˆœμœ„ 큐

var maxPriorityQueue = PriorityQueue<Int>(sort: >)

maxPriorityQueue.enqueue(5)
maxPriorityQueue.enqueue(1)
maxPriorityQueue.enqueue(3)
maxPriorityQueue.enqueue(2)

// κ°€μž₯ μš°μ„ μˆœμœ„κ°€ 높은 μš”μ†Œ(μ΅œλŒ€κ°’) 확인
print(maxPriorityQueue.peek!) // 5

// μš”μ†Œ 제거
print(maxPriorityQueue.dequeue()!) // 5
print(maxPriorityQueue.dequeue()!) // 3
print(maxPriorityQueue.dequeue()!) // 2
print(maxPriorityQueue.dequeue()!) // 1

 

 

PriorityQueueλŠ” λ‚΄λΆ€μ μœΌλ‘œ Heap을 μ‚¬μš©ν•˜μ—¬ 효율적으둜 μš”μ†Œλ₯Ό μ‚½μž…(enqueue)ν•˜κ³  제거(dequeue)ν•©λ‹ˆλ‹€.

sort λ§€κ°œλ³€μˆ˜μ— 따라 μ΅œμ†Œ μš°μ„ μˆœμœ„ 큐둜 λ™μž‘ν•  μˆ˜λ„ 있고, μ΅œλŒ€ μš°μ„ μˆœμœ„ 큐둜 λ™μž‘ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

μ‹œκ°„ λ³΅μž‘λ„λŠ” enqueue와 dequeue λͺ¨λ‘ O(log n)μž…λ‹ˆλ‹€.

 

λ°˜μ‘ν˜•