📌 문제
- 파이썬 알고리즘 인터뷰 25번 문제
📌 날짜
2020.01.30
📌 시도 횟수
Failed
💡 해결 Code
class MyCircularQueue:
def __init__(self, k: int):
self.front = 0
self.rear = 0
self.q = [None] * k
self.len = k
def enQueue(self, value: int) -> bool:
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:
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이 되는 경우를 따로 처리할 필요도 없었따😥