1. ํ (Queue)
ํ๋ ์ด๋ ๊ฒ ์ ์ ์ ์ถ(FIFO) ๊ตฌ์กฐ์ด๋ค.
์ฐ์ฐ ๊ณผ์ ์๋
- enqueue : ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ์์
- dequeue : ํ์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๋ ์์
- front : ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๋ ๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ
- rear : ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ
์ด๋ฐ ๊ฐ๋ ๋ค์ด ๋ฑ์ฅ ํ๋ค.
1. ์ฝ๊ฒ ์ดํด๋ฅผ ์ํด ์์ ๋ฅผ ์ดํด ๋ณด๊ฒ ๋ค.
์ฐ๋ฆฌ๊ฐ ์ค ์์๋ ๋๊ธฐ์ด์ ์๊ฐํ๋ฉด ์ฝ๋ค.
ํฐ์ผ ๋งคํ์์ ์ด๋ ๊ฒ ์ค์ ์ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ค์ ์ ์ผ ๋จผ์ ์ A๊ฐ ๋จผ์ ํ๋ฅผ ์ฌ๊ณ , ์ ์ผ ๋์ค์ ์ E๊น์ง ๋ชจ๋ ์์๋๋ก ํ๋ฅผ ์ด ์ ์์ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ
๊ทผ๋ฐ ์ฌ๊ธฐ์ F๊ฐ ๋ฑ์ฅํด์ ์ค์ ์ ๋ค.
๊ทธ๋ผ ์ด๋ rear๋ ์๋ก ์ถ๊ฐ๋ ๋งจ ๋ค์ F๋ก ๋๋ค.
์ด F๋ฅผ ์ถ๊ฐํ๋ ์์ ์ enqueue ๋ผ๊ณ ํ๊ณ , F ์ถ๊ฐํ ์์น๋ฅผ ๋ํ๋ด๋ ํฌ์ธํฐ๊ฐ rear๊ฐ ๋๋ ๊ฒ์ด๋ค.
์ด์ A๊ฐ ๋งคํ๊ฐ ๋๋์ ์ค์ ๋ฒ์ด๋ฌ๋ค.
๊ทธ๋ผ front๋ ๊ทธ ๋ค์ ์์์๋ B๊ฐ ๋๋ ๊ฑฐ๊ณ , ์ด๋ ๊ฒ ์ญ์ ํ๋ ์์ ์dequeue๋ผ๊ณ ํ๋ค ์ด๋ dequeue์ ๊ฒฐ๊ณผ๊ฐ์ A์ด๋ค.
front๋ ๊บผ๋ผ ์์น๋ฅผ ๋ํ๋ด๋ ํฌ์ธํฐ๊ฐ ๋๋ ๊ฒ์ด๋ค.
2. ํ์ ํ๊ณ์
ํ๋ฅผ ์ด๋ ๊ฒ ์ถ๊ฐ๋ฅผ ๋ค ํ๋ค๊ณ ์น์.
์ด๋๋ front๊ฐ ๊ณ ์ ๋ ์ํ์์ ๊ณ์ rear๋ง ๋ฐ๋์๋ค.
๊ทธ๋ผ ์ด์ ์ญ์ ๋ฅผ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ!
1. front ๊ณ ์ ๋ฐฉ๋ฒ
๋ณด๋ฉด ์์์ ๋ถํฐ ๊บผ๋ด๊ณ ์ญ์ญ์ญ ์์ผ๋ก ๊ฐ๋๋ฐ ์ด๋, ๊ณ์ ์ ๋ ฌ์ด ์ด๋ค์ง๋ ๊ฒ์ด๋ค.
2. Rear๊ณ ์ ๋ฐฉ๋ฒ
Front์ ํฌ์ธํฐ ๊ฐ์ด ์ฆ๊ฐํ๋ฉฐ ์ ๋ ฌ ํ์ ์์ด ์ญ์ ๋ฅผ ์ฐฉ์ฐฉ ํด๋๊ฐ๋ค.
๊ทธ๋ฌ๋ ๋ฌธ์ ์ ์ํฉ์ Rear๊ฐ ๋ฐฐ์ด์ ๋์ ์์๋ -> ์ด๋๋ ๋ฐฐ์ด์ด ๊ฝ ์ฐจ์๋ ์ํ๋ก ์ธ์ํ๊ฒ ๋๋ค.
์ค์์ ์์ ๋ค ๋น์ด์๋๋ฐ..
์ด๋ฅผ ํด๊ฒฐ ํ๊ธฐ ์ํด ์ํ ํ๊ฐ ์ฌ์ฉ๋๋ค.
2. ์ํ ํ, ํํ ํ (Circular Queue)
์์ ๋ฌธ์ ์์ ์ด์ front์ rear์ max ์ธ๋ฑ์ค๋ฅผ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ก ์ง์ ํ๊ณ , ๊ทธ ์ฌ์ด์์ ๊ณ์ ์ํํ๊ฒ ๋ง๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋๊น Rear๊ฐ 6 ํฌ๊ธฐ์ ๋ฐฐ์ด์์ ์ฌ์ฉ๋๋ค๋ฉด rear๊ฐ ์ธ๋ฑ์ค 5(0,1,2,3,4,5)์์ ์ด๋ํด์ผํ ๋์
์ธ๋ฑ์ค 0 ์ผ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ์ด๋ค.
front๋ ๊ฐ์ ๋ฉ์ปค๋์ฆ์ด๋ค.
์ํ ํ์ ์ํ์ด๋ค
์ด๊ธฐ ์ดํ์ ์ธํ ์ buffer๋ฅผ ํ๋ ๋๊ณ ํฌํ์ํ๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค.
3. python ์ฝ๋๋ก ๊ตฌํ
class CircularQueue:
def __init__(self, n):
self.maxCount = n
self.data = [None] * n
self.count = 0
self.front = -1
self.rear = -1
def size(self):
return self.count
def isEmpty(self):
return self.count == 0
def isFull(self):
return self.count == self.maxCount
def enqueue(self, x):
if self.isFull():
raise IndexError('Queue full')
self.rear = (self.rear+1)%self.maxCount // ๋ฐฐ์ด ๊ธธ์ด ๋งํผ ์ํ
self.data[self.rear] = x
self.count += 1
def dequeue(self):
if self.isEmpty():
raise IndexError('Queue empty')
self.front = (self.front+1)%self.maxCount // ๋ฐฐ์ด ๊ธธ์ด ๋งํผ ์ํ
x = self.data[self.front]
self.count -= 1
return x
def peek(self):
if self.isEmpty():
raise IndexError('Queue empty')
// front ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ์ง ์๊ณ ์ถ๋ ฅํ๊ธฐ ์ํด dequeue()๋ฅผ ๋ถ๋ฌ์ค์ง ์๊ณ ์ด๋ ๊ฒ ์ง์ ์กฐํ
return self.data[(self.front+1) % self.maxCount]
def solution(x):
return 0