25. Design Circular Queue

eunseo kim 👩‍💻·2021년 1월 30일
0
post-custom-banner

🎯 leetcode - 622. Design Circular Queue


📌 문제

- 파이썬 알고리즘 인터뷰 25번 문제

📌 날짜

2020.01.30

📌 시도 횟수

Failed

💡 해결 Code

class MyCircularQueue:
    def __init__(self, k: int):
        self.front = 0
        self.rear = 0
        self.q = [None] * k  # None으로 해야됨
        self.len = k

    def enQueue(self, value: int) -> bool:
        # 값을 넣고 rear 포인터가 한 칸 이동함
        if self.q[self.rear] is None:
            self.q[self.rear] = value
            self.rear = (self.rear + 1) % self.len
            return True
        else:
            return False

    def deQueue(self) -> bool:
        if self.q[self.front] is None:
            return False
        else:
            self.q[self.front] = None
            self.front = (self.front + 1) % self.len
            return True

    def Front(self) -> int:
        if self.q[self.front] is None:
            return -1
        else:
            return self.q[self.front]

    def Rear(self) -> int:
        if self.q[self.rear] is None:
            return -1
        else:
            # 값을 넣고 포인터가 이동하므로, 실제로 출력할 때는 `self.rear - 1`
            return self.q[self.rear - 1]

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

    def isFull(self) -> bool:
        return self.front == self.rear and self.q[self.front] is not None

💡 문제 해결 방법

- 위의 코드에서는 rear 값을 넣고, rear의 위치를 이동시켰다.
- front도 마찬가지로 값을 빼고, front의 위치를 이동시켰다.
- 주의할 점은, front의 경우에는 현재 front를 출력할 때 뺀 후에 이동하므로
그대로 현재 위치의 값 (self.q[self.front])을 리턴하면 된다.
- 그러나, rear의 경우에는 값을 넣고 → 한 칸 이동시킨다.
즉, 현재 rear의 실제 값을 얻기 위해서는 포인터의 위치가 (self.rear - 1)이 되어야 한다!

*참고로 self.rear - 1을 하게 되면 만약 rear = 0일 때는? 
👽파이썬에서 list[-1]은 맨 끝 요소이다!!!!!!!!!👽

💡 새롭게 알게 된 점

-

❌ (한번에 맞추지 못한 경우) 오답의 원인

- 초기값 설정에서 [None]*k == []*k 라고 착각했다.
>> self.q = [] * k       →   self.q = []
>> self.q = [None] * k   →   self.q = [None, None, None...]

- 값을 넣고 rear을 한칸 이동할 지, 아니면 이동하고 rear의 위치에 값을 넣을지..
이것을 하나로 딱! 정해서 구현했어야 됐는데...
계속 뒤죽박죽 값을 넣었다가 이동하고 이동하고 넣고 하니까 코드가 엉망이 되어버렸다.

- 👽파이썬에서 list[-1]은 어차피 맨 끝 요소이다...👽
그래서 rear = 0일 때 rear - 1이 -1이 되는 경우를 따로 처리할 필요도 없었따😥

profile
열심히💨 (알고리즘 블로그)
post-custom-banner

0개의 댓글