카테고리 없음

[자료구조] Queue(Deque) 구현

소깡이 2022. 9. 27. 16:02
728x90

이 글은 자료구조라고 해야하는지, 알고리즘이라고 해야하는지 모르겠지만 일단 자료구조라고 했다.

 

앞선 글에서도 많이 언급한 것처럼 Swift에는 Queue(Deque)가 없어서 구현을 직접해야한다.

알고리즘 문제를 풀 때 시간초과 같은 오류가 발생하지 않기 위해서는?

 

class Queue<T> {
    var array: [T?]
    var head = 0

    var isEmpty: Bool {
        return count == 0
    }

    var count: Int {
        return array.count - head
    }

    var first: T? {
    	return isEmpty ? nil : array[head]
    }

    var last: T? {
    	return isEmpty ? nil : array.last!
    }

    init(_ array: [T?] = [T?]()) {
        self.array = array
    }

    func append(_ element: T) {
        self.array.append(element)
    }
    
    // ✅ 주의할 부분 ✅
    func removeFirst() -> T? {
        guard head < array.count, 
        let element = array[head] else { return nil }
        
        array[head] = nil
        head += 1

        return element
    }

    func removeLast() -> T? {
        return array.removeLast()
    }
}

 

위에서 만든 클래스 Queue의 핵심은 head로 포인터처럼 작동한다.

가장 앞 쪽을 의미하며 Swift에서 removeLast()는 O(1)의 시간 복잡도를 갖기 때문에 문제가 되지 않고, 앞쪽을 삭제할 때가 주의해야한다.