본문 바로가기
알고리즘 & PS

[Python] 프로그래머스 Lv 2 - 최대 용량이 정해진 FIFO 큐 클래스

by 다람이도토리 2021. 4. 24.

스택 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())