[LeetCode] 622. Design Circular Queue 원형 큐 디자인

2022. 2. 26. 21:48· #️⃣ Project 및 개발일지/Algorithm 문제 풀이
목차
  1. # 문제 설명 

파이썬으로 배우는 알고리즘 책을 공부하며 풀었던 LeetCode문제들을 재정리해보자.

 

# 문제 설명 

622번 Design Circular Queue는 원형 큐를 디자인 하는 문제이다.

 

구현해야 하는 함수

 

| 원형 큐 원리 | 

앞쪽의 공간이 남아있을때, 끝과 앞쪽을 연결하여 앞쪽으로도 추가할 수 있도록 재활용 가능한 구조이다. 

크기가 4인 원형 큐 
크기가 3인 원형 큐 

 

# 풀이방법 1  (내 풀이)

class MyCircularQueue:

    def __init__(self, k: int):
        # print("init")
        self.q = [None] * k
        self.q_len = k
        self.front_p = 0
        self.rear_p = 0
        
    def enQueue(self, value: int) -> bool:
        # print("enQueue : ", self.front_p, self.rear_p, self.q)
        if self.q[self.rear_p] is None : 
            self.q[self.rear_p] = value 
            self.rear_p = (self.rear_p + 1) % self.q_len
            return True
        else : 
            return False

    def deQueue(self) -> bool:
        # print("deQueue : ", self.front_p, self.rear_p, self.q)
        if self.q[self.front_p] is not None : 
            self.q[self.front_p] = None
            self.front_p = (self.front_p + 1) % self.q_len
            return True
        else : 
            return False

    def Front(self) -> int:
        # print("Front : ", self.front_p, self.rear_p, self.q)
        if self.q[self.front_p] is None:
            return -1
        else : 
            return self.q[self.front_p]

    def Rear(self) -> int:
        # print("Rear : ", self.front_p, self.rear_p, self.q)
        if self.q[self.rear_p-1] is None :
            return -1
        else : 
            return self.q[self.rear_p-1]

    def isEmpty(self) -> bool:
        # print("isEmpty : ", self.front_p, self.rear_p, self.q)
        if self.front_p == self.rear_p and self.q[self.front_p] is None :
            return True
        else : 
            return False

    def isFull(self) -> bool:
        # print("isFull : ", self.front_p, self.rear_p, self.q)
        if self.front_p == self.rear_p and self.q[self.front_p] is not None  :
            return True
        else :
            return False


# 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()

| 아이디어  | 

배열과, front_p. reer_p 투 포인터를 두어서, 마지막 위치와 시작 위치를 연결하는 원형 구조를 만든다. 

값 추가 시(enQueue)에는 rear_p포인터를 이용하여 값을 추가하고, 값을 삭제 시(deQueue)엔 front_p를 움직여 값을 삭제한다.

 

empty인경우와 full 인경우 front_p와 rear_p 포인터가 같은 인덱스를 가르키는데, 이때 다른 점은 가리키는 인덱스에 값의 여부이다. 이 점을 이용하여 코드를 작성하였다.  

 

 

| 코드 수정 (책 잠고) | 

if self.front_p == self.rear_p and self.q[self.front_p] is None :
            return True
        else :
            return False

 

위에서 작성한 나의 코드를 보면 if문의 조건문을 이용하여 return 값을 다르게 설정하였는데, 책의 코드를 보면 if문을 사용하지 않고 다음과 같이 한 줄로 return 값을 설정하였다. 코드 길이가 훨씬 줄어들었으니 앞으로 이 방법을 이용하여 코드 작성해야겠다. 

 

return self.front_p == self.rear_p and self.q[self.front_p] is None
 
 

| 핵심 |

empty인경우와 full 인경우 front_p와 rear_p 포인터가 같은 인덱스를 가르키는데, 이때 다른 점은 가리키는 인덱스에 값의 여부이다.

 

 

# 결과 

초반에 포인터 작성시 self. 을 이용하지 않고, 바로 front_p 이런식으로 작성하였다. 

또한 empty와 full 일 때 포인터 위치를 잘 파악하지 못하여 submit에서 많이 틀렸다. 

'#️⃣ Project 및 개발일지 > Algorithm 문제 풀이' 카테고리의 다른 글

[LeetCode] 739. Daily Temperatures 일일 온도  (0) 2022.03.17
[LeetCode] 255. Implement Stack using Queues 큐를 이용한 스택 구현  (0) 2022.02.26
[LeetCode] 20. Valid Parentheses 유효한 괄호  (0) 2022.02.23
[LeetCode] 21. Merge Two Sorted List 두 정렬 리스트 병합  (0) 2022.02.21
[LeetCode] 92. Reverse Linked List II 역순 연결 리스트Ⅱ  (0) 2022.02.21
  1. # 문제 설명 
'#️⃣ Project 및 개발일지/Algorithm 문제 풀이' 카테고리의 다른 글
  • [LeetCode] 739. Daily Temperatures 일일 온도
  • [LeetCode] 255. Implement Stack using Queues 큐를 이용한 스택 구현
  • [LeetCode] 20. Valid Parentheses 유효한 괄호
  • [LeetCode] 21. Merge Two Sorted List 두 정렬 리스트 병합
HyeM207
HyeM207
"Reflections and Growth Through Records" 회고와 기록을 통한 성장으로
HyeM207
HYEM's Storage
HyeM207
  • ALL (115)
    • #️⃣ CS (Computer Science) (5)
      • Database (2)
      • SQL (2)
      • Git (1)
    • #️⃣ Data Engineering (43)
      • Airflow (18)
      • Spark (8)
      • Snowflake (2)
      • BI,DashBoard (4)
      • ELK Stack (2)
      • Hadoop (5)
      • Kafka (4)
    • #️⃣ Cloud&Container (16)
      • AWS (8)
      • GCP (1)
      • Docker (6)
      • Kubernetes (1)
    • #️⃣ Project 및 개발일지 (37)
      • Mini Project (5)
      • 개발일지 (9)
      • Algorithm 문제 풀이 (20)
    • #️⃣ 책 리뷰 (4)
    • #️⃣ 회고글&프로젝트 후기 (10)

공지사항

인기 글

최근 댓글

블로그 메뉴

  • 홈
  • 태그
  • 방명록
hELLO · Designed By 정상우.v4.2.2
HyeM207
[LeetCode] 622. Design Circular Queue 원형 큐 디자인
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.