πŸ–₯ CS/자료ꡬ쑰

[자료ꡬ쑰] 큐(QUEUE)

KiwiπŸ’» 2022. 5. 17. 13:05

큐(Queue)λž€?

μ„œλΈŒμ›¨μ΄μ— μƒŒλ“œμœ„μΉ˜λ₯Ό 사렀고 μ‚¬λžŒλ“€μ΄ 쀄을 μ„œκ³  μžˆλ‹€. μ΄λ•Œ 이 μ‚¬λžŒλ“€μ΄ μ„œμžˆλŠ” 쀄을 μ˜μ–΄λ‘œ 뭐라 ν‘œν˜„ν• κΉŒ? λ°”λ‘œ 큐(queue) 이닀.

 

5λͺ…μ˜ μ‚¬λžŒμ΄ μƒŒλ“œμœ„μΉ˜λ₯Ό 사렀고 기닀리고 μžˆλ‹€κ³  κ°€μ •ν• λ•Œ, μƒŒλ“œμœ„μΉ˜λ₯Ό κ°€μž₯ λ¨Όμ € μ‚΄ 수 μžˆλŠ” μ‚¬λžŒμ€ 큐(queue) 의 맨 μ•ž (front) 첫번째 μ‚¬λžŒμΌ 것이고, λ§ˆμ§€λ§‰μœΌλ‘œ μƒŒλ“œμœ„μΉ˜λ₯Ό ꡬ맀 ν•  수 μžˆλŠ” μ‚¬λžŒμ€ κ°€μž₯ 늦게 온 5번째 μ‚¬λžŒμΌ 것이닀. λ˜ν•œ ꡬ맀가 λλ‚œ 첫번째 μ‚¬λžŒμ€ μƒŒλ“œμœ„μΉ˜λ₯Ό λ“€κ³  큐(queue) λ₯Ό λ²—μ–΄λ‚  것이고, λ§Œμ•½ μƒˆλ‘œμš΄ μ‚¬λžŒμ΄ μƒŒλ“œμœ„μΉ˜λ₯Ό κ΅¬λ§€ν•˜λ € μ™”λ‹€λ©΄ λ§ˆμ§€λ§‰ λ‹€μ„―λ²ˆμ§Έ μ‚¬λžŒ λ’€ (rear) 에 쀄을 μ„œμ•Ό ν•  것이닀.

 

Queue μ—­μ‹œ 이 κ²½μš°μ™€ 같은 μ„ μž…μ„ μΆœ(First in, First Out)λ°©μ‹μ˜ 자료ꡬ쑰라고 ν•  수 μžˆλ‹€.

큐의 νŠΉμ§•

μœ„ μ˜ˆμ‹œμ—μ„œ μ–ΈκΈ‰ν•œ 바와 같이 μƒŒλ“œμœ„μΉ˜λ₯Ό κ΅¬λ§€ν•œ ν›„ μ‚¬λžŒλ“€μ΄ λΉ μ Έλ‚˜κ°€λŠ” 곳은 큐의 맨 μ•žμ΄ 되고, μƒˆλ‘œμš΄ μ‚¬λžŒμ΄ 쀄을 μ„œλŠ” 곳은 큐의 맨 λ’€κ°€ λœλ‹€. λ˜ν•œ κ°€μž₯ λ§ˆμ§€λ§‰μ— 온 μ‚¬λžŒμ΄ 큐의 λ§¨μ•žμ— μ„€ μˆ˜κ°€ μ—†κ³ , κ°€μž₯ λ‚˜μ€‘μ— 쀄에 μ„  μ‚¬λžŒμ΄ μ•žμ˜ μ‚¬λžŒλ“€μ„ λ¬΄μ‹œν•˜λ©΄μ„œ ꡬ맀λ₯Ό λ¨Όμ €ν•˜κ³  큐λ₯Ό λΉ μ Έ λ‚˜κ°ˆ μˆ˜λ„ μ—†λ‹€.

 

이처럼 queueμ—μ„œλ„ ν•œμͺ½ λμ—μ„œλŠ” μ‚­μ œ μž‘μ—…λ§Œ 이루어지며, λ‹€λ₯Έμͺ½ λμ—μ„œλŠ” μ‚½μž… μž‘μ—…λ§Œμ΄ 이루어진닀. λ˜ν•œ μ›μ†Œκ°€ λ“€μ–΄μ˜¨ μˆœμ„œλŒ€λ‘œ 큐λ₯Ό λΉ μ Έλ‚˜κ°€κ²Œ λœλ‹€.

 

μ΄λ•Œ μ‚­μ œμ—°μ‚°λ§Œμ΄ 이루어 μ§€λŠ” 곳을 ν”„λ‘ νŠΈ(front: μ€„μ˜ 맨 μ•ž)라고 ν•˜λ©°, μ‚½μž…μ—°μ‚°λ§Œ μ΄λ£¨μ–΄μ§€λŠ” 곳을 리어(rear: μ€„μ˜ 맨 λ’€)라고 ν•œλ‹€. λ‚˜μ•„κ°€ 큐의 λ¦¬μ–΄μ—μ„œ μ΄λ£¨μ–΄μ§€λŠ” μ‚½μž…μ—°μ‚°μ„ 인큐(enQueue: μ‚¬λžŒλ“€μ΄ 쀄을 μ„œλŠ” 것), ν”„λ‘ νŠΈμ—μ„œ μ΄λ£¨μ–΄μ§€λŠ” μ‚­μ œμ—°μ‚°μ„ 디큐(deQueue: μ‚¬λžŒλ“€μ΄ 쀄을 λΉ μ Έ λ‚˜κ°€λŠ” 것)라고 ν•œλ‹€.

Swiftμ—μ„œ 큐 κ΅¬ν˜„ν•˜κΈ° (Array 기반)

struct CalculatorItemQueue<T> {
    private var queue: [T] = []
    // μ‚¬λžŒλ“€μ΄ μ„œ μžˆλŠ” 쀄을 말함
    mutating func enqueue(data: T) {
        list.append(data)
    }
    // μƒŒλ“œμœ„μΉ˜λ₯Ό μ‚¬λŸ¬ 온 μ‚¬λžŒμ΄ 맨 뒀에 쀄을 μ„œλŠ” 것
    mutating func dequeue() -> T? {
        list.removeFirst()
    }
    // μƒŒλ“œμœ„μΉ˜λ₯Ό ꡬ맀 μ™„λ£Œν•œ 맨 μ•žμ˜ μ‚¬λžŒμ˜ 쀄을 λ– λ‚˜λŠ” 것
    mutating func removeAll() {
        list.removeAll()
    }
    // κ΅¬ν˜„ ν•„μˆ˜ 쑰건 μ•„λ‹˜
}