๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โŒจ๏ธ Language/swift

[Swift] Dequeue ๊ตฌํ˜„ํ•˜๊ธฐ

by hyebin (Helia) 2024. 9. 27.
๋ฐ˜์‘ํ˜•

Dequeue๋Š” ์–‘์ชฝ ๋์—์„œ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ์ด๋ฅผ ํ†ตํ•ด ํ์™€ ์Šคํƒ์˜ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Dequeue๋ฅผ ๊ตฌ์กฐ์ฒด์™€ ๋ฐฐ์—ด์„ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์„ ํ™œ์šฉํ•˜์—ฌ Dequeue ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•˜๊ณ , ์ฃผ์š” ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

struct Deque<T> {
    private var enqueue: [T] = []  // ๋’ค์ชฝ์—์„œ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€/์ œ๊ฑฐํ•˜๋Š” ๋ฐฐ์—ด
    private var dequeue: [T] = []  // ์•ž์ชฝ์—์„œ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€/์ œ๊ฑฐํ•˜๋Š” ๋ฐฐ์—ด
    
    var count: Int {
        return enqueue.count + dequeue.count
    }
    
    var isEmpty: Bool {
        return enqueue.isEmpty && dequeue.isEmpty
    }
    
    var first: T? {
        return dequeue.isEmpty ? enqueue.first : dequeue.last
    }
    
    var last: T? {
        return enqueue.isEmpty ? dequeue.first : enqueue.last
    }
    
    mutating func pushFirst(_ n: T) {
        dequeue.append(n)
    }
    
    mutating func pushLast(_ n: T) {
        enqueue.append(n)
    }
    
    mutating func popFirst() -> T? {
        if dequeue.isEmpty {
            dequeue = enqueue.reversed()
            enqueue.removeAll()
        }
        return dequeue.popLast()
    }
    
    mutating func popLast() -> T? {
        if enqueue.isEmpty {
            dequeue.reverse()
            let returnValue = dequeue.popLast()
            dequeue.reverse()
            return returnValue
        } else {
            return enqueue.popLast()
        }
    }
}

 

์œ„ ์ฝ”๋“œ์—์„œ๋Š” Dequeue์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. pushFirst(_:): ์•ž์ชฝ์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1)์ž…๋‹ˆ๋‹ค.
  2. pushLast(_:): ๋’ค์ชฝ์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์š”์†Œ๋ฅผ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์œ„์น˜์— ์‚ฝ์ž…ํ•˜๋ฏ€๋กœ, ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n)์ž…๋‹ˆ๋‹ค.
  3. popFirst(): ์•ž์ชฝ์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ํ‰๊ท  O(1), ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n)์ž…๋‹ˆ๋‹ค.
  4. popFront(): ๋’ค์ชฝ์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ํ‰๊ท  O(1), ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n)์ž…๋‹ˆ๋‹ค.

์ด Dequeue ๊ตฌ์กฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

var deque = Deque<Int>()
deque.pushLast(1)
deque.pushLast(2)
deque.pushFirst(0)
print(deque.popFirst() ?? -1)  // ์ถœ๋ ฅ: 0
print(deque.popLast() ?? -1)   // ์ถœ๋ ฅ: 2
print(deque.count)             // ์ถœ๋ ฅ: 1
print(deque.isEmpty)           // ์ถœ๋ ฅ: false

 

์ด๋ ‡๊ฒŒ Dequeue๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํ์™€ ์Šคํƒ์˜ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•