반응형
문제 설명
Implement a first in first out (FIFO) queue using only two stacks. The implemented queue should support all the functions of a normal queue (push
, peek
, pop
, and empty
).
Implement the MyQueue
class:
void push(int x)
Pushes element x to the back of the queue.int pop()
Removes the element from the front of the queue and returns it.int peek()
Returns the element at the front of the queue.boolean empty()
Returnstrue
if the queue is empty,false
otherwise.
Notes:
- You must use only standard operations of a stack, which means only
push to top
,peek/pop from top
,size
, andis empty
operations are valid. - Depending on your language, the stack may not be supported natively. You may simulate a stack using a list or deque (double-ended queue) as long as you use only a stack's standard operations.
Example 1:
Input
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
Output
[null, null, null, 1, 1, false]
Explanation
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false
Constraints:
1 <= x <= 9
- At most
100
calls will be made topush
,pop
,peek
, andempty
. - All the calls to
pop
andpeek
are valid.
Follow-up: Can you implement the queue such that each operation is amortized O(1)
time complexity? In other words, performing n
operations will take overall O(n)
time even if one of those operations may take longer.
문제풀이
class MyQueue:
def __init__(self):
// 문제에서 2개의 스택을 사용하라고 하니, 배열을 2개를 사용합니다
self.stack1 = []
self.stack2 = []
def push(self, x: int):
// stack1에는 push 데이터를 넣어줍니다.
self.stack1.append(x)
def pop(self):
// pop을 할때에는 stack1의 배열을 거꾸로 변경하는 과정이 필요합니다.
// pop을 할때, stack1.pop()을 하여, stack2에 넣어줍니다.
// stack1 [1, 2, 3] -> stack2 = [3, 2, 1]
self.peek()
return self.stack2.pop()
def peek(self):
// peek는 큐의 첫번째 값을 가져와야 하므로
// stack1의 모든 값을 거꾸로 stack2에 넣어서, stack2[-1]을 리턴해줍니다.
if not self.stack2:
// stack1의 모든 값이 나올때까지 해주는데,
// stack2가 비어있지 않은 경우에 stack2에 값을 넣을 경우
// pop()이 힘들어지니 stack1을 그대로 이용합니다.
// 1) stack1 [1, 2, 3] -> stack2 [3, 2, 1]
// 2) MyQueue.push(4)
// 3) stack1 -> [4] , stack2 [3, 2, 1] 의 경우
// stack1의 값을 넣어주면 stack2는, [3, 2, 1, 4]가 되므로 pop을 하기가 힘듬
// 4) stack1의 [4]는 어차피 stack2가 다 빌때까지 필요없으므로
// 그냥 stack2가 빌때까지 stack1에 넣어둠
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2[-1]
def empty(self):
return (len(self.stack1)==0) and (len(self.stack2)==0)
반응형
'스터디 공간' 카테고리의 다른 글
[Python-Leetcode] 4. Median of Two Sorted Arrays (difficulty : Hard - ☆☆☆) (0) | 2022.04.27 |
---|---|
[sklearn] Data Scaling (Standard / minmax / maxabs / Robust) (0) | 2022.02.27 |
[Python-Leetcode] 739. dailyTemperatures (difficulty : Medium - ☆☆) (0) | 2021.08.11 |
Python - Sorted (정렬, key 2개) 오름차순 / 내림차순 (0) | 2021.08.09 |
[Programmers 문제풀이] 해시 - 베스트앨범 (0) | 2021.08.09 |
댓글