[μλ£κ΅¬μ‘°] ν(Queue)
Questions
- Stackκ³Ό Queueμ μ°¨μ΄μ μ 무μμΈκ°μ? (Nμ¬ μ νλ©΄μ )
- Priority Queueμ λμ μλ¦¬κ° μ΄λ»κ² λλμ? (Nμ¬ μ νλ©΄μ )
- ν / μ°μ μμ νμ κ°λ μ λν΄ μ€λͺ ν΄λ³΄μΈμ.
- ν μ½μ (enqueue) / μμ (dequeue) ν¨μλ₯Ό λ°°μ΄ / λ§ν¬λ리μ€νΈλ‘ ꡬννλΌ.
- μ€ν 2κ°λ‘ ν 1κ°λ₯Ό ꡬνν MyQueue ν΄λμ€λ₯Ό ꡬννλΌ.
ν(Queue)μ κ°λ
νλ λ°°μ΄κ³Ό ν¨κ» κ°μ₯ μ¬μ΄ μλ£ κ΅¬μ‘° μ€ νλμ΄λ€. νλ μ»΄ν¨ν°μμ κ°μ₯ ν΅μ¬μ μΈ μννΈμ¨μ΄ μ€ νλμΈ μ΄μ체μ μμλ λ§μ΄ μ°μΈλ€. λ, μΈν°λ·μμ λ€νΈμν¬ κΈ°λ₯μμλ λ§μ΄ μ¬μ©λλ€.
Queueμ μ¬μ μ μλ―Έλ 1. (무μμ κΈ°λ€λ¦¬λ μ¬λ, μλμ°¨ λ±μ) μ€, νΉμ μ€μ μμ κΈ°λ€λ¦¬λ κ²μ μλ―Ένλ€. μ¦, κ°μ₯ λ¨Όμ λ£μ λ°μ΄ν°λ₯Ό κ°μ₯ λ¨Όμ κΊΌλΌ μ μλ μ μ μ μΆ = FIFO (First-In, First-Out) λ°©μμ μλ£κ΅¬μ‘°λ₯Ό λ§νλ€.
νμ μ½μ μ°μ°μ ν μͺ½ λ(rear)μμ, μμ μ°μ°μ λ°λμͺ½(front)μμ μΌμ΄λλ€. μ΄λ, νμ 리μ΄μμ μ΄λ£¨μ΄μ§λ μ½μ μ°μ°μ μΈν(enQueue), νλ‘ νΈμμ μ΄λ£¨μ΄μ§λ μμ μ°μ°μ λν(dnQueue)λΌκ³ λΆλ₯Έλ€. ⇒ μ κ·Όλ°©λ²μ κ°μ₯ 첫 μμμ λ μμλ‘λ§ κ°λ₯
νμ μμκ° νλλ λ€μ΄μμ§ μμ λλ 곡백(empty) μνλΌ νκ³ κ½ μ°¨μ λ μ΄μ μμλ₯Ό μ§μ΄λ£μ§ λͺ»ν κ²½μ° ν¬ν(full) μνλΌκ³ νλ€.
νμ νμ© μμ
νλ μ£Όλ‘ λ°μ΄ν°κ° μ λ ₯λ μκ° μμλλ‘ μ²λ¦¬ν΄μΌ ν νμκ° μλ μν©μ μ΄μ©νλ€.
- μ°μ μμκ° κ°μ μμ μμ½ (νλ¦°ν°μ μΈμ λκΈ°μ΄)
- νλ‘μΈμ€ κ΄λ¦¬
- λλΉ μ°μ νμ(BFS, Breadth-First Search) ꡬν
- μΊμ(Cache) ꡬν
νμ ꡬν
PythonμΌλ‘ νλ₯Ό ꡬννλ λ°©λ²μ μΈ κ°μ§ μ λκ° μμΌλ©° κ° λ°©λ²λ§λ€ μ₯λ¨μ μ΄ μλ€.
- List μλ£ν μ¬μ©
- Collections λͺ¨λμ deque μ¬μ©
- queue λͺ¨λμ Queue ν΄λμ€ μ¬μ©
1. List μλ£ν μ¬μ©
- ꡬν
# νμ 맨 λμ λ°μ΄ν° μ½μ queue = [1, 2, 3] queue.append(4) queue.append(5) print(queue) #----------------------------------- # ν 맨 μ λ°μ΄ν° μμ queue.pop(0) # 1 μμ queue.pop(0) # 2 μμ print(queue)
- νμ΄μ¬μ κΈ°λ³Έ μλ£νμΈ listλ₯Ό μ¬μ©ν λ°©λ²μ΄λ€. .append(x) λ©μλλ₯Ό μ¬μ©νμ¬ λ°°μ΄μ λμ λ°μ΄ν°λ₯Ό μΆκ°νκ³ , .pop(0) λ©μλλ₯Ό μ¬μ©νμ¬ μ²« λ°μ΄ν°λ₯Ό μ κ±°νλ€. μ€νμ ꡬνν λμ λ°λλ‘ λ©μλλ₯Ό μ¬μ©νλ©΄ ν μλ£κ΅¬μ‘°λ₯Ό μ¬μ©νλ ν¨κ³Όκ° λλ€. insert(0, x) ν¨μλ₯Ό μ¬μ©νλ©΄ 맨 μμ λ°μ΄ν°λ₯Ό λ£μ΄ λ°λ λ°©ν₯μΌλ‘ μ½μ λ κ°λ₯νλ€.
- λ¨μ : μ±λ₯ λ¬Έμ
- λ¨, μ΄ λ°©λ²μ μ±λ₯μ μΌλ‘ λ¬Έμ κ° μλ€. list μλ£νμ 무μμ μ κ·Όμ μ΅μ νλ μλ£ κ΅¬μ‘°μ΄κΈ° λλ¬Έμ΄λ€. pop(0)μ΄λ insert(0, x)λ O(n)μ μκ° λ³΅μ‘λλ₯Ό κ°μ§κ³ μμ΄ λ΄λ λ°μ΄ν° κ°μκ° λ§μμ§μλ‘ νμ°ν λλ €μ§κ² λλλ°, μ΄λ 첫λ²μ§Έ λ°μ΄ν°λ₯Ό μ κ±°νλ©΄ κ·Έ λ€μ λͺ¨λ λ°μ΄ν°λ₯Ό μμΌλ‘ ν μΉΈμ© λΉκΈ°κ³ 맨 μμ λ°μ΄ν°λ₯Ό μ½μ νλ €λ©΄ λͺ¨λ λ°μ΄ν°λ₯Ό ν μΉΈμ© λ―Έλ μ°μ°μ΄ λ΄λΆμ μΌλ‘ ν¬ν¨λμ΄ μκΈ° λλ¬Έμ΄λ€.
2. Collections λͺ¨λμ deque μ¬μ©
π‘ λ°ν¬(=λν, deque)λ dobule-ended queueμ μ½μλ‘ λ°μ΄ν°λ₯Ό μλ°©ν₯μμ μΆκ°νκ³ μ κ±°ν μ μλ μλ£κ΅¬μ‘°λ€. μ€νκ³Ό νμ κ° νΉμ§μ΄ λλ ·νμ§λ§ λ³λλ‘ κ΅¬λΆν΄ μ¬μ©νκΈ° λ²κ±°λ‘μ΄λ°, dequeλ λ μλ£νμ νΉμ§μ λͺ¨λ κ°λλ€. Double Ended Queueλ₯Ό μ§μνλ©΄ ‘μ λμ΄ μμ΄ λλ ν’μ΄μ§λ§, λ°ν¬λ νμ μ±μ§λ§ κ°λ κ²μ΄ μλλΌ μ€νκ³Ό νμ μ±μ§μ λͺ¨λ κ°λλ€. μ¦, μμͺ½ λμμ μ½μ κ³Ό μμ κ° λͺ¨λ κ°λ₯ν μλ£κ΅¬μ‘°λ€.νμ΄μ¬μ collections λͺ¨λμμ dequeλ₯Ό λΆλ¬μ μ¬μ©νλ€. νμ΄μ¬μ 리μ€νΈμ μ μ¬νμ§λ§ Collections.dequeμ μ°μ°μΈ appendleft()μ popleft() μ μκ°λ³΅μ‘λλ₯Ό μ΄ν΄λ³΄λ©΄ μλ€μμ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ μλκ° λͺ¨λ O(1)λ‘ λ§€μ° λΉ λ₯Έ κ²μ μ μ μλ€. μ΄λ λ΄λΆμ μΌλ‘ doubly linked listλ‘ κ΅¬νλμ΄μκΈ° λλ¬Έμ΄λ€. λ°λΌμ μμ 리μ€νΈλ‘ ꡬνν ν κ΅¬μ‘°λ³΄λ€ μ±λ₯μ΄ λ°μ΄λλ€.
- ꡬν
from collections import deque
# deque μ μΈ-----------------------------
dq = deque([])
# dequeμ λ°μ΄ν° μΆκ°
dq.append(1)
dq.append(2)
dq.append(3)
dq.append(4)
print(dq)
# dequeμ 맨 μ μμ μ κ±°------------------
print(dq.popleft()) # 1 μΆλ ₯ λ° μ κ±°
print(dq.popleft()) # 2 μΆλ ₯ λ° μ κ±°
dq.popleft() # 3 μ κ±°
(dq.popleft)) # 4 μ κ±°
print(dq)
- λ¨μ
- 무μμ μ κ·Όμ μκ°λ³΅μ‘λκ° O(n)μ΄κ³ , λ΄λΆμ μΌλ‘ linked listλ₯Ό μ¬μ©ν΄ Nλ²μ§Έ λ°μ΄ν°μ μ κ·Όνλ €λ©΄ Nλ² μνκ° νμνλ€.
3. Queueλͺ¨λμ queue λ©μλ νμ©
- ꡬν
* μ°Έκ³ : κΈ°ν queue λͺ¨λμ μ μλ ν΄λμ€ μ 보λ λ€μκ³Ό κ°λ€.
queue.Queue(maxSize) μ μ μ μΆ => ν queue.LifoQueue(maxsize) νμ μ μΆ λ°©μ ν => μ€ν queue.PriorityQueue(maxsize) λ°μ΄ν°λ§λ€ μ°μ μμλ₯Ό μ£Όκ³ μ°μ μμκ° λμ μμΌλ‘ λ°μ΄ν°λ₯Ό μΆλ ₯νλ μ°μ μμ ν (μ°μ μμ μ«μκ° μμ μλ‘ λμ μμ) queue.SimpleQueue μ λ ₯μ νμ΄ μλ μ μ μ μΆ ν - κ° ν΄λμ€λ λ€μ λ©μλλ₯Ό λμΌνκ² μ¬μ©νλ€.
- qsize() : ν κ°μ²΄μ λ±λ‘λ μμ΄ν κ°―μ λ°ν
- put(n) : ν κ°μ²΄μ μμ΄ν λ±λ‘
- put_nowait : λΈλ‘νΉ μμ΄ ν κ°μ²΄μ μμ΄ν λ±λ‘
- get : μμ΄ν 1κ° λ°ν
- get_nowait() : λΈλ‘νΉμμ΄ ν κ°μ²΄μ λ€μ΄μλ μμ΄ν λ°ν
-
from queue import queue # Queue μ μΈ que = Queue() # qμ λ°μ΄ν° μΆκ° que.put(1) que.put(2) que.put(3) que.put(4) # queμμ 맨 μ μμ μ κ±° print(que.get()) # 1 print(que.get()) # 2 print(que.get()) # 3 print(que.get()) # 4
- νμ΄μ¬μ Queue λͺ¨λμμλ ν(Queue), μ°μ μμν(PriorityQueue), μ€ν(LifoQueue)λ₯Ό μ 곡νκ³ μμ΅λλ€. νΉν ν λͺ¨λμ μ€λ λ νκ²½μ κ³ λ €νμ¬ μμ±λμ΄ μκΈ° λλ¬Έμ μ¬λ¬ μ€λ λλ€μ΄ λμμ ν(Queue), μ°μ μμν(PriorityQueue), μ€ν(LifoQueue)κ³Ό κ°μ κ°μ²΄μ μ κ·Όνμ¬ μμ μ μννμ¬λ μ μμ μΌλ‘ λμνλ κ²μ 보μ₯ν©λλ€. μ¬κΈ°μ κΈ°λ³Έμ μΈ Queueλ₯Ό μ¬μ©νμ¬ μ½κ² Queueλ₯Ό νμ©ν΄ 보λλ‘ νκ² μ΅λλ€.
νμ μ’ λ₯
μ ν ν (Linear Queue)
μ ν ν(Linear Queue)λ κ°μ₯ κΈ°λ³Έμ μΈ ννμ ν(Queue)μ΄λ€. μ ν νμλ λ¨μ μ΄ μ‘΄μ¬νλλ°, μ½μ λ° μμ λ₯Ό λ°λ³΅νλ€λ³΄λ©΄ rearκ° λ§¨ λ§μ§λ§ μΈλ±μ€λ₯Ό κ°λ¦¬ν€κ³ , μμλ λΉμ΄μμ μλ μμ§λ§ μ΄λ₯Ό κ½ μ°Όλ€κ³ μΈμνλ€λ μ μ΄λ€.
μ΄λ μ€μ λ°μ΄ν°λ μμ λλ§λ€ ν μΉΈ μμΌλ‘ μ΄λμν€μ§ μμκ³ , μΈλ±μ€ λ¨μλ‘ νμ μ°μ°μ μ§ννκΈ° λλ¬Έμ΄λ€. μ΄μ μ겨λ μμ΄λμ΄κ° μν νμ΄λ€.
μν ν (=νν ν, Circular Queue)
μν νλ μ ν νμ λ§μ°¬κ°μ§λ‘ 1μ°¨μ λ°°μ΄λ‘ ꡬννμ§λ§, λ Όλ¦¬μ μΌλ‘ λ°°μ΄μ μ²μκ³Ό λμ΄ μ°κ²°λμ΄ μλ κ²μΌλ‘ μκ°νλ κ²μ΄λ€.
μν νμμλ frontμ rear μ κ°λ μ΄ μ½κ° λ³κ²½λλ€. λ¨Όμ μ΄κΈ° κ°μ -1μ΄ μλ 0μ΄λ€.
frontλ νμ νμ 첫 λ²μ§Έ μμμ νλ μμ, rearλ λ§μ§λ§ μμλ₯Ό κ°λ¦¬ν¨λ€.
- μ²μμ front, rearλ λͺ¨λ 0μ΄κ³ μ½μ μμλ rearκ° λ¨Όμ μ¦κ°λκ³ , μ¦κ°λ μμΉμ μλ‘μ΄ λ°μ΄ν°κ° μ½μ λλ€.
- λ μμ μμλ frontκ° λ¨Όμ μ¦κ°λ λ€μ, μ¦κ°λ μμΉμμ λ°μ΄ν°λ₯Ό μμ νλ€.
μν ν ꡬν
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')
return self.data[(self.front + 1) % self.maxCount]
#μ°μ°μ μ μ
size() : νμ¬ νμ λ€μ΄ μλ λ°μ΄ν° μμμ μλ₯Ό ꡬν¨
isEmpty() : νμ¬ νκ° λΉμ΄ μλμ§λ₯Ό νλ¨
isFull() : νμ λ°μ΄ν° μμκ° κΌ μ°¨ μλμ§λ₯Ό νλ¨
qneueue(x) : λ°μ΄ν° μμ xλ₯Ό νμ μΆκ°
dequeue() : νμ 맨 μμ μ μ₯λ λ°μ΄ν° μμλ₯Ό μ κ±°(λν, λ°ν)
peek() : νμ 맨 μμ μ μ₯λ λ°μ΄ν° μμλ₯Ό λ°ν(μ κ±°νμ§ μμ)
μ°μ μμ ν(Priority Queue)
μΌλ°μ μΈ ν(Queue)λ First in-First Out ꡬ쑰μ΄λ, μ°μ μμ ν(Priority Queue)λ λ€μ΄κ° μμμ μκ΄μμ΄ μ°μ μμκ° λμ λ°μ΄ν°κ° λ¨Όμ λμ€λ κ²μ λ§νλ€. μ°μ μμ νλ ν(Heap)μ΄λΌλ μλ£κ΅¬μ‘°λ₯Ό κ°μ§κ³ ꡬνν μ μλ€.
'Computer Science > Data Structure' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μλ£κ΅¬μ‘°] νΈλ¦¬ (Tree) (0) | 2022.04.26 |
---|---|
[μλ£κ΅¬μ‘°] μ°κ²°λ¦¬μ€νΈ(Linked List) (0) | 2022.03.11 |
[μλ£κ΅¬μ‘°] μ€ν(Stack) (0) | 2022.03.10 |
[μλ£κ΅¬μ‘°] μ¬κ·(Recursion) (0) | 2022.03.10 |
[μλ£κ΅¬μ‘°] μλ£κ΅¬μ‘°μ μκ³ λ¦¬μ¦ (0) | 2022.03.08 |