[leetcode] 스택을 이용한 큐 구현

김민서·2024년 1월 4일
0

알고리즘 문제풀이

목록 보기
2/47
  1. Implement Queue using Stacks

저번 큐를 이용한 스택 구현과 마찬가지로 파이썬의 deque를 이용해 구현하였다.
스택이다 보니 값을 한 쪽 방향에서만 넣고 뺄 수 있기 때문에 이에 맞게 appendleft와 popleft 함수를 사용해 구현했다.

from collections import deque
class MyQueue(object):
	def __init__(self):
    	self.queue = deque()
        
    def push(self, x):
    	self.queue.appendleft(x)
    
    def pop(self):
    	temp_queue = deque()
        for i in range(len(self.queue)):
        	temp_queue.appendleft(self.queue.popleft())
        temp = temp_queue.popleft()
        
        for i in range(len(temp_queue)):
        	self.queue.appendleft(temp_queue.popleft())
        return temp
        
    def peek(self):
    	temp_queue = deque()
        for i in range(len(self.queue)):
        	temp_queue.appendleft(self.queue.popleft())
        temp = temp_queue.popleft()
        temp_queue.appendleft(temp)
        
        for i in range(len(temp_queue)):
        	self.queue.appendleft(temp_queue.popleft())
        return temp
        
    def empty(self):
    	return len(self.queue) == 0

내가 구현한 pop:
원래의 큐(스택으로 구현, self.queue)에서 임시 큐(스택으로 구현, temp_queue)로 모든 요소들을 pop해서 담으면 순서가 거꾸로 된다. 이 후 이 임시 큐의 가장 위에 있는 요소를 pop하여 반환하면 큐에서 pop한 것 같은 결과를 얻을 수 있다고 생각했다.
하지만 이 방법은 for문이 두 개가 된다. 아무리 봐도 for문을 두 개나 쓰는 건 아닌 것 같아서 다른 방법을 고민해봤지만 생각이 나지 않았다.
그래서 다른 방법을 찾아보았다.

class MyQueue:
	def __init__(self):
    	self.input = []
        self.output = []
        
    def push(self, x):
    	self.input.append(x)
    
    def pop(self):
    	self.peek()
        return self.output.pop()
    
    def peek(self):
    	if not self.output:
        	while self.input:
            	self output.append(self.input.pop())
        return self.output[-1]
   
   	def empty(self):
    	return not self.input and not self.output

0개의 댓글