문제
2개의 스택만을 사용하여 FIFO 큐를 구현하여야 하는 문제이다. 구현된 큐는 일반 큐의 모든 기능(push
, pop
, empty
)를 지원하여야 하며 구현해야 하는 MyQueue 클래스는 다음과 같다.
push(x: int) -> void
: x를 큐의 맨 뒤에 넣는다.pop() -> int
: 큐의 가장 앞에 있는 요소를 삭제하고 반환한다.peek() -> int
: 큐의 맨 앞에 있는 요소를 반환한다.empty() -> boolean
: 큐가 비어있으면 true, 그렇지 않으면 false를 반환한다.
이때, 아래 사항을 참고하여야 한다.
- 스택의 기본 연산(
push to top
,peek or pop from top
,size
및is empty
)만 사용하여야 한다. - 언어에 따라서는 스택이 navtive로 지원되지 않을 수 있다. 스택의 기본 연산만 사용하는 경우
list
또는deque(double-end-queue)
를 사용하여 스택을 구현할 수 있다.
풀이
스택은 LIFO 정책에 따라 먼저 넣은 데이터를 가장 나중에 꺼낼 수 있다. 슬라이싱을 잘 활용한다면 리스트로 충분히 구현할 수 있지 않을까라는 생각으로 문제에 접근하였다. 파이썬 알고리즘 인터뷰 책에서는 두 개의 리스트를 스택으로 사용하였는데, 출력하기 위해 순서를 바꾸는 과정에서 슬라이싱의 시간 복잡도와 차이가 나지 않는다.
class MyQueue:
def __init__(self):
self.input = []
self.output = []
# ... (생략) ....
# O(N)
def pop(self) -> int:
if not self.output:
while self.input:
self.output.append(self.input.pop())
return self.output.pop()
이를 슬라이싱으로 구현하면 다음과 같다.
class MyQueue:
def __init__(self):
self.body = []
# ... (생략) ...
# O(N-1)
def pop(self) -> int:
val = self.body[0]
self.body = self.body[1:]
return val
전체 코드
class MyQueue:
def __init__(self):
self.body = []
def push(self, x: int) -> None:
self.body.append(x)
def pop(self) -> int:
val = self.body[0]
self.body = self.body[1:]
return val
def peek(self) -> int:
return self.body[0]
def empty(self) -> bool:
return not self.body
'Algorithm > LeetCode' 카테고리의 다른 글
LeetCode #409 - Longest Palindrome(가장 긴 팰린드롬) 풀이 (0) | 2022.03.16 |
---|---|
LeetCode #622 - Design Circular Queue(원형 큐 디자인) 풀이 (0) | 2022.03.16 |
LeetCode #049 - Group Anagrams(그룹 애너그램) 문제 풀이 (0) | 2022.03.16 |
LeetCode #206 - Reverse Linked List(역순 연결 리스트) 풀이 (0) | 2022.03.15 |
LeetCode #021 - Merge Two Sorted Lists(두 개의 연결 리스트 병합) 풀이 (0) | 2022.03.15 |