📝 코테/BOJ

[Swift] 백준10845 큐

JerryiOS 2023. 3. 28. 17:03

import Foundation

/// 기본 VPS : ()
/// 만일 x가 VPS라면 (x)도 VPS
/// x: VPS, y: VPS라면 xy도 VPS

let N = Int(readLine()!)!

var queue = Queue<Int>()

for _ in 1...N {
    let li = readLine()!
    
    if li.hasPrefix("push") {
        let strComp = li.components(separatedBy: " ")
        let num = Int(strComp[1])!
        queue.enqueue(num)
    } else if li.hasPrefix("pop") {
        if let num = queue.dequeue() {
            print(num)
        } else {
            print("-1")
        }
    } else if li.hasPrefix("size") {
        print(queue.count)
    } else if li.hasPrefix("empty") {
        if queue.isEmpty {
            print(1)
        } else {
            print(0)
        }
    } else if li.hasPrefix("front") {
        print(queue.front ?? -1)
    } else if li.hasPrefix("back") {
        print(queue.back ?? -1)
    }
}

struct Queue<T> {
    private var queue: [T?] = []
    private var head: Int = 0
    
    public var count: Int {
        return queue.count - head
    }
    
    public var isEmpty: Bool {
        return count == 0
    }
    
    public mutating func enqueue(_ element: T) {
        queue.append(element)
    }
    
    public mutating func dequeue() -> T? {
        if isEmpty {
            return nil
        }
        
        let element = queue[head]
        queue[head] = nil
        head += 1
        
        if head > 50 {
            queue.removeFirst(head)
            head = 0
        }
        return element
    }
    
    public var front: T? {
        if isEmpty {
            return nil
        }
        return queue[head]
    }
    
    public var back: T? {
        if isEmpty {
            return nil
        }
        return queue.last ?? nil
    }
}

시간제한이 0.5초라서 시간복잡도가 O(1)인 큐를 사용하였다.

반응형