622. Design Circular Queue

Taesoo Kim·2023년 2월 7일
0

CrackingAlgorithm

목록 보기
23/36

문제링크: https://leetcode.com/problems/design-circular-queue/

원형 큐를 구현하는 문제다. 원형큐가 조금 생소한 개념인데, 간단하게 큐의 양단을 이어붙인 형태이다.
큐는 일정한 크기가 있는 자료구조인데, 푸시를 뒤로밖에 못해서 앞에 자리가 있더라도 값을 못 넣는 경우가 생긴다.
그런 경우를 막기위해 큐의 양 끝을 연결해서, 뒤에 값을 다 담으면 앞쪽부터 채우게 한다.

Problem

문제 자체는 간단하다. 일련의 매서드를 구현만 하면 되는데, enQueue, deQueue, Front, Rear, isEmpty, isFull
정도가 되겠다.
enQueue는 자료를 채우는 매서드이고, 만약 채울수 없다면, false를 반환한다. deQueue는 반대의 개념으로, 뺄 수 없다면, false를 반환한다.
Front, Rear는 각각의 포인터 위치를 반환하면 되고, isEmpyt, isFull 은 직관적으로 원형큐가 비었는지, 꽉차있는지를 확인하는 매서드이다.

Approach & Solution

개략적인 구조는 스택에 두 포인터 front,rear 를 사용하여 구현한다. 두 포인터로 큐의 시작과 끝을 기록해주고, 만약 포인터가 스택의 길이를 넘어간다면, 다시 스택 앞으로 옮겨주면된다.

class MyCircularQueue:

    def __init__(self, k: int):
        self.stk = [None] * k
        self.front = 0
        self.rear = 0
        self.len = k

    def enQueue(self, value: int) -> bool:
        if self.stk[self.rear] == None:
            self.stk[self.rear] = value
            self.rear = (self.rear + 1) % self.len
            return True
        else:
            return False
        
    def deQueue(self) -> bool:
        if self.stk[self.front] != None:
            self.stk[self.front] = None
            self.front = (self.front + 1) % self.len
            
            return True
        else:
            return False

    def Front(self) -> int:
        if self.stk[self.front] != None:
            return self.stk[self.front]
        else:
            return -1

    def Rear(self) -> int:
        if self.stk[self.rear - 1] != None:
            return self.stk[self.rear - 1]
        else:
            return -1
    
    def isEmpty(self) -> bool:
        for i in range(self.len):
            if self.stk[i] != None:
                return False
        return True
        
    def isFull(self) -> bool:
        for i in range(self.len):
            if self.stk[i] == None:
                return False
        return True
        
# Your MyCircularQueue object will be instantiated and called as such:
# obj = MyCircularQueue(k)
# param_1 = obj.enQueue(value)
# param_2 = obj.deQueue()
# param_3 = obj.Front()
# param_4 = obj.Rear()
# param_5 = obj.isEmpty()
# param_6 = obj.isFull()

원형 큐의 개념이 조금 생소하거나, 투포인터를 모른다면 구현하기 조금 힘들것도 같다. 또, 다른 릿코드의 풀이를 보긴 했는데, 문제의 의도와 맞지 않은 풀이라고 생각해서 참고하진 않았다.

profile
SailingToTheMoooon

0개의 댓글