스택 2개로 큐를 만들 수 있다? 이에 대해서 알아보자.
프로그래머스 Lv 2 최대 용량이 정해진 FIFO 큐 클래스 문제풀이.
풀이 방법
스택 2개를 준비한다.
각각 1번스택, 2번 스택이라고 하자.
(1) 삽입의 경우
최대 용량까지만, 1번에 무조건 넣는다.
(2) 삭제의 경우
1번의 바닥의 거를 꺼내는데, 이는 다음과 같이 한다.
- 바닥까지 모두 다 순차적으로 꺼내서 2번 스택에 넣는다.
- 2번 스택의 가장 윗부분은, 1번 스택의 밑부분이다. 2번에서 다시 pop을 한다.
- 2번 스택에 남은 거를 모두 1번으로 옮긴다. 다시 돌려놔야 하는걸 잊지말자!
코드
# Stack 2개로 queue를 구현할 수 있다? ㅋㅋ루이지
class MyStack(object):
def __init__(self):
self.lst = list()
def push(self, x):
self.lst.append(x)
def pop(self):
return self.lst.pop()
def size(self):
return len(self.lst)
class MyQueue(object):
def __init__(self, max_size):
self.stack1 = MyStack()
self.stack2 = MyStack()
self.max_size = max_size
def qsize(self):
return self.stack1.size() + self.stack2.size()
def push(self, item):
if self.qsize() == self.max_size:
return False
self.stack1.push(item)
return True
def pop(self):
try:
if self.stack1.size() == 0:
raise IndexError
while self.stack1.size() > 0:
self.stack2.push(self.stack1.pop())
result = self.stack2.pop()
while self.stack2.size() > 0:
self.stack1.push(self.stack2.pop())
except IndexError:
return False
return result
n, max_size = map(int, input().strip().split(' '))
queue = MyQueue(max_size)
for _ in range(n):
cmd = input()
if "PUSH" in cmd:
cmd, elm = cmd.split(" ")
print(queue.push(elm))
elif cmd == "SIZE":
print(queue.qsize())
elif cmd == "POP":
print(queue.pop())
'알고리즘 & PS' 카테고리의 다른 글
[Python] 프로그래머스 Lv 4 - 버스여행 (0) | 2021.04.25 |
---|---|
[Python] 프로그래머스 Lv 3 - 자물쇠와 열쇠(2020 카카오 코테 기출) (0) | 2021.04.24 |
[Python] 프로그래머스 Lv 3 - 게임아이템 (0) | 2021.04.23 |
[Python] 프로그래머스 Lv 3 - 방문 길이 (0) | 2021.04.23 |
[Python] 프로그래머스 Lv 3 - N-queen Problem (0) | 2021.04.22 |