오늘은 LeetCode 225번 문제, “Implement Stack using Queues” 를 풀었다.
어제 풀었던 스택을 큐로 구현하는 문제의 반대 버전으로, 큐만 사용해서 스택을 구현하는 문제였다.
아휴 .. 또 문제를 제대로 읽지 않았다.
처음엔 문제를 제대로 읽지 않고 그냥 스택을 구현하라는 줄 알고, 아래와 같이 작성했다:
class MyStack {
private var array: [Int]
init() {
self.array = .init()
}
func push(_ x: Int) {
array.append(x)
}
func pop() -> Int {
return array.removeLast()
}
func top() -> Int {
return array.last ?? 0
}
func empty() -> Bool {
return array.isEmpty
}
}
당연히 정답은 맞았지만 틀린 것이었다.
문제의 핵심은 “큐만 사용해서 스택을 구현하라”는 것이었다.
문제를 다시 읽고, 두 개의 큐를 사용하는 방식으로 접근했다.
핵심 아이디어는 다음과 같다:
class MyStack {
private var queue1: [Int] = []
private var queue2: [Int] = []
func push(_ x: Int) {
queue1.append(x)
}
func pop() -> Int {
while queue1.count > 1 {
queue2.append(queue1.removeFirst())
}
let popped = queue1.removeFirst()
swap(&queue1, &queue2)
return popped
}
func top() -> Int {
while queue1.count > 1 {
queue2.append(queue1.removeFirst())
}
let top = queue1.removeFirst()
queue2.append(top)
swap(&queue1, &queue2)
return top
}
func empty() -> Bool {
return queue1.isEmpty
}
}
연산 | 시간 복잡도 | 설명 |
---|---|---|
push | O(1) | 큐의 뒤에 요소 추가 |
pop | O(n) | n-1개 요소를 이동하고 마지막 요소 제거 |
top | O(n) | n-1개 요소를 이동하고 마지막 요소를 다시 추가 |
empty | O(1) | 비어 있는지 확인 |
오늘 복습하면서 다시 떠올랐던 중요한 사실:
Swift로 알고리즘 문제를 풀 때는 단순히 동작만 맞추는 게 아니라, 언어의 성능 특성과 자료구조의 구현 방식까지 고려해야 한다는 걸 다시 한 번 느꼈다.