티스토리 뷰

알고리즘 문제를 풀어보다 leetcode의 원형 큐 구현 문제( Design Circular Queue )를 만났다.

과거 큐를 공부하면서 원형 큐에 대한 구현을 해봐야겠다는 생각을 항상 미루고 있었는데 이번 기회에 이를 학습하였다.

회전 큐를 만드는 과정이 다음과 같다고 생각하였다

 

이를 왜 사용할까 생각해 보았을때, 기존 큐의 경우 삽입, 출력 과정에서 배열의 크기가 변경되며 O(n)의 시간복잡도를 요구한다. 하지만 회전 큐에 경우 정해놓은 메모리 사이즈에서 index로 접근해 값을 변경하기 때문에 메모리의 크기는 변경되지 않아 메모리를 효율적으로 사용하는 경우에 필요로 하다고 생각한다.

 

 

자세한 개념은 해당 블로그를 참조하였다.

 

[Data Structure] ① 원형 큐(Circular Queue) 알아보기

지난 번 글에서 구현한 동적 배열을 사용한 큐에 단점이 있었다. 자료를 꺼내올 때 모든 데이터를 한 칸씩 앞으로 이동해야 하는 점이었다. 원형 큐로 이러한 단점을 보완할 수 있다.

velog.io

 

초기값 


class MyCircularQueue:

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

투포인터를 이용해서 처음값과 이동할 값, 배열을 만들어준다.

 

 

큐 상태 확인


    def isEmpty(self) -> bool:
        return self.front == self.rear and self.que[self.front] == None
        

    def isFull(self) -> bool:
        return self.front == self.rear and self.que[self.front] != None

isEmpty -> 큐가 비어있는지 확인한다. rear포인터와 front 포인터가 일치하고,  que[front]에 값이 없다면 비어있는 상태 

isFull -> 큐가 차있는지 확인한다. rear포인터와 front 포인터가 일치하고, que[front] 에 값이 존재한다면 가득 차있는 상태

 

 

값 삽입 (enQueue)


    def enQueue(self, value: int) -> bool:
        if not self.isFull():
            self.que[self.rear] = value
            self.rear = (self.rear + 1) % self.max_len
            return True
        else:
            return False

 

큐에 값을 삽입하는 과정으로 큐가 isFull 상태가 아니면

rear포인터에 값을 변경하고 rear포인터의 위치를 +1 이동시킨다.

 

 

값 삭제 (deQueue)


    def deQueue(self) -> bool:
        if not self.isEmpty():
            self.que[self.front] = None
            self.front = (self.front +1) % self.max_len
            return True
        else:
            return False

 

큐의 첫번째 값을 제거하는 과정으로 큐가 isEmpty 상태가 아니면

front포인터의 값을 None으로 변경 후 front 포인터를 +1 이동한다.

 

첫번째 값 확인 (Front) , 마지막 값 확인 (Rear)


    def Front(self) -> int:
        if self.isEmpty():
            return -1
        else:
            return self.que[self.front]
  def Rear(self) -> int:
        if self.isEmpty():
            return -1
        else:
            return self.que[self.rear - 1]

 

 

전체 코드


class MyCircularQueue:

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

    def enQueue(self, value: int) -> bool:
        if not self.isFull():
            self.que[self.rear] = value
            self.rear = (self.rear + 1) % self.max_len
            return True
        else:
            return False

    def deQueue(self) -> bool:
        if not self.isEmpty():
            self.que[self.front] = None
            self.front = (self.front +1) % self.max_len
            return True
        else:
            return False

    def Front(self) -> int:
        if self.isEmpty():
            return -1
        else:
            return self.que[self.front]     

    def Rear(self) -> int:
        if self.isEmpty():
            return -1
        else:
            return self.que[self.rear - 1]

    def isEmpty(self) -> bool:
        return self.front == self.rear and self.que[self.front] == None
        

    def isFull(self) -> bool:
        return self.front == self.rear and self.que[self.front] != None

 

감사합니다.


 

 


참고

 

파이썬 알고리즘 인터뷰 - 예스24

코딩 테스트와 인터뷰를 준비하는 취준생과 이직자를 위한 알고리즘 문제 풀이 완벽 마스터!세계 최고 온라인 문제 풀이 사이트인 리트코드(LeetCode)의 기출문제 풀이와 분석!『파이썬 알고리즘

www.yes24.com

 

Design Circular Queue - LeetCode

Can you solve this real interview question? Design Circular Queue - Design your implementation of the circular queue. The circular queue is a linear data structure in which the operations are performed based on FIFO (First In First Out) principle, and the

leetcode.com

 

[Data Structure] ① 원형 큐(Circular Queue) 알아보기

지난 번 글에서 구현한 동적 배열을 사용한 큐에 단점이 있었다. 자료를 꺼내올 때 모든 데이터를 한 칸씩 앞으로 이동해야 하는 점이었다. 원형 큐로 이러한 단점을 보완할 수 있다.

velog.io

 

'개발 > 자료구조 알고리즘' 카테고리의 다른 글

[자료구조] 그래프  (0) 2023.06.13
[자료구조] Linked List 구현  (0) 2023.06.05
[자료구조] Binary Tree  (0) 2023.05.25
[자료구조] HashTable 구현  (0) 2023.05.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함