ν(Queue)
0. μμ½
class Node {
constructor(data) {
this.data = data;
this.next = null;
}
}
class Queue {
constructor(array) {
this.front = null;
this.rear = null;
this.size = 0;
if (array) {
array.forEach((item) => {
this.enqueue(item);
});
}
}
// νκ° λΉμ΄μλμ§ νμΈνκΈ°
isEmpty() {
return !Boolean(this.size);
}
// νμ μμ μΆκ°νκΈ°
enqueue(data) {
const node = new Node(data);
if (this.isEmpty()) this.front = node;
else this.rear.next = node;
this.rear = node;
this.size++;
}
// νμ μμ μ κ±°νκΈ°
dequeue() {
const frontQueue = this.front;
if (this.isEmpty()) return;
this.front = this.front.next;
this.size--;
if (this.size === 0) this.rear = null;
return frontQueue;
}
// νμ ν΄λΉ μμκ° μ‘΄μ¬νλμ§ νμΈνμ¬ μ‘΄μ¬νλ©΄ ν΄λΉ μμλ₯Ό λ°ννκΈ°
contains(data) {
let cur = this.front;
let node;
while (!node) {
if (!cur) return;
if (cur.data === data) node = cur;
else cur = cur.next;
}
return node;
}
// νμ λͺ¨λ μμ μΆλ ₯νκΈ°
display() {
let cur = this.front;
let index = 0;
while (index < this.size) {
console.log(`${index}. ${cur.data}`);
cur = cur.next;
index++;
}
}
}1. κ°μ
JAVA λλ νμ΄μ¬ κ°μ κ²½μ° λ΄μ₯ λΌμ΄λΈλ¬λ¦¬μ νλ₯Ό μ 곡νκ³ μμ§λ§ μλ°μ€ν¬λ¦½νΈ κ²½μ°μ κ·Έλ μ§ μλ€. κ·Έλμ μλ°μ€ν¬λ¦½νΈμμ νλ₯Ό μ¬μ©νκΈ° μν΄μλ μ§μ νλ₯Ό μμ±ν΄μΌνλ€.
μ¬μ€ μλ°μ€ν¬λ¦½νΈμμ νλ₯Ό μ¬μ©νμ§ μκ³ λ°°μ΄μ μ΄μ©νμ¬ νμ κΈ°λ₯μ μ¬μ©ν μ μλ€. Array.shift() λ©μλμ Array.pop() λ©μλλ₯Ό μ¬μ©νλ©΄ λλ€. νμ§λ§ μ΄λ κ² λλ©΄ μκ°λ³΅μ‘λμμ νμ ν° μ°¨μ΄λ₯Ό 보μ΄κ² λλ€. νμμμ μμ μ κ±°λ μκ°λ³΅μ‘λ O(1)λ₯Ό λ°λ₯΄κ² λλλ° λ°°μ΄μμμ Array.shift() λ©μλλ₯Ό μ¬μ©ν μμ μ κ±°λ μκ°λ³΅μλ O(n)λ₯Ό λ°λ₯΄κ² λκΈ° λλ¬Έμ΄λ€.
Array.shift() λ©μλμ λ΄λΆ λ‘μ§μ λ€μκ³Ό κ°λ€.
λ°°μ΄μ 첫 λ²μ§Έ μμμ μ κ·Όνμ¬ ν΄λΉ κ°μ λ°ννκ³ λ°°μ΄μμ μ κ±°
κΈ°μ‘΄ λ°°μ΄μμ 첫 λ²μ§Έ μμμ κ°μ μ¬λΌμ‘μ§λ§ 곡κ°μ μ°¨μ§νκ³ μμ
Array.shift()λ©μλλ κ³μν΄μ 첫 λ²μ§Έ μμμ μ κ·Όν μμ λ°λΌμ λλ¨Έμ§ λ°°μ΄μ μμλ€μ μμΌλ‘ ν μΉΈμ© λΉκ²¨μ£Όλ κ³Όμ νμ
μ¦ λ§μ§λ§μ κ³Όμ μ λν μ°μ°μ΄ μΆκ°μ μΌλ‘ μꡬλλ€. μ΄λ¬ν μΆκ°μ μΈ μ°μ°μΌλ‘ μΈν΄ μ½λ© ν μ€νΈ λ¬Έμ μμ λ°μ΄ν°μ μμ΄ λ§€μ° ν° κ²½μ°, μκ° λ³΅μ‘λλ₯Ό λ§€μ° μΈμΈνκ² κ΄λ¦¬ν΄μΌ νλ κ²½μ°μλ λ°°μ΄λ‘ μ΄μ©νμ¬ λ¬Έμ λ₯Ό νκ² λλ€λ©΄ ν΅κ³Όν μ μλ κ²½μ°κ° μμ μ μλ€. μ΄λ° κ²½μ° νλ₯Ό μ΄μ©νμ¬ λ λΉ λ₯Έ μκ° λ³΅μ‘λλ‘ λ¬Έμ μ μ κ·Όνλ€λ©΄ ν΅κ³Όν μ μλ νλ₯ μ΄ μ¬λΌκ° κ²μ΄λ€.
μ°Έκ³ ν λ§ν μ½λ© ν μ€νΈ λ¬Έμ
2. νλ?
FIFO(First in, First out) μμΉμΌλ‘ λ§λ€μ΄μ§ μλ£κ΅¬μ‘°λ‘ μλ°μ€ν¬λ¦½νΈ μμ§μμ λΉλκΈ° ν¨μ μ€νμ μ½λ°±λ€μ΄ λκΈ°μ΄λ‘ λ€μ΄μ€λ Task queueκ° λνμ μΈ μμ΄λ€.

νλ λμ΄κ³΅μμμ λ¨Όμ μ¨ μ¬λμ΄ λμ΄κΈ°κ΅¬λ₯Ό λ¨Όμ νλ κ²κ³Ό λ§μ°¬κ°μ§λ‘ λ¨Όμ λ£μ λ°μ΄ν°κ° λ¨Όμ λκ°λ€. νμ κ°μ₯ 첫 λ²μ§Έ μμλ₯Ό front, λ μμλ₯Ό rearλ‘ λΆλ₯΄λ©° λ°μ΄ν°μ μ κ·Όλ°©λ²μ frontμ rearλ‘λ§ κ°λ₯νλ€. λν rearμμλ μ½μ
μ°μ°λ§ μΌμ΄λκ³ , front μμλ μμ μ°μ°λ§ μΌμ΄λλ€.
νμμ μ¬μ©λλ λ©μλλ μλμ κ°μ΄ μ μν μ μλ€.
dequeue:
frontλ₯Ό μ κ±°νκ³ λ°ννλ€.enqueue: νμ μμλ₯Ό μΆκ°νλ€. μ΄λ ν΄λΉ μμλ
rearκ° λλ€.contains: ν΄λΉ μμκ° νμ μ‘΄μ¬νλμ§ νμΈνμ¬ μ‘΄μ¬νλ©΄ ν΄λΉ μμλ₯Ό λ°ννλ€.
3. μ°κ²° 리μ€νΈλ‘ ν ꡬννκΈ°
μ°κ²° 리μ€νΈλ₯Ό ν΅ν΄ νλ₯Ό ꡬννλ€.
3-1. λ
Έλμ νμ κΈ°λ³Έ ꡬ쑰
λ Έλμ νμ κΈ°λ³Έ ꡬ쑰λ μ°κ²° 리μ€νΈμμ λ€λ£¨μλ λ΄μ©κ³Ό κ°λ€.
3-2. νκ° λΉμ΄μλμ§ νμΈνκΈ°
μλ°μ€ν¬λ¦½νΈμμ μ«μ 0μ λΆλ¦¬μΈμΌλ‘ λ³ννμ λ falseλ₯Ό κ°λ¦¬ν¨λ€. κ·Έλ κΈ° λλ¬Έμ μμ !λ₯Ό λΆμ¬ tureλ‘ λ°κΎΈμ΄ isEmpty ν¨μκ° νμ μμκ° μμ κ²½μ° trueλ₯Ό λ°ννκ² νλ€.
3-3. νμ μμ μΆκ°νκΈ°
νμ μμκ° μμ κ²½μ° μλ‘κ² μμ±λ
Nodeλ₯Όforntλ‘ μ§μ νλ€.νμ μμκ° μμ κ²½μ° κΈ°μ‘΄ νμ
rear.nextλ₯Ό μλ‘κ² μμ±λNodeλ‘ μ§μ νλ€.frontμrearλNodeμ΄λ€. κ·Έλμ data μμ±κ³Ό next μμ±μ κ°μ§λ€.λ§μ§λ§μΌλ‘ μλ‘κ² μμ±λ
Nodeλ₯Όrearλ‘ λ°κΎΈλ©΄ λλ€.(sizeλ νλ μ¬λ¦¬μ.)
3-4. νμ μμ μ κ±°νκΈ°
νμ
frontλ₯ΌfrontQueueμ μ μ₯νλ€.νκ° λΉμ΄μλ€λ©΄ μ무κ²λ 리ν΄νμ§ μκ³ ν¨μλ₯Ό μ’ λ£νλ€.
κΈ°μ‘΄ νμ
frontλ₯Όfront.nextλ‘ μ§μ νλ€.sizeλ₯Ό νλ κ°μμν¨λ€.λ§μ½
sizeκ° 0μ΄ λλ©΄ νμ μμκ° μλ κ²μ΄λ―λ‘rearλ₯Όnullλ‘ λ°κΎΈμ΄μΌ νλ€.λ§μ§λ§μΌλ‘ νμμ μ κ±°ν μμμΈ
frontQueueλ₯Ό λ°ννλ€.
3-5. νμ ν΄λΉ μμκ° μ‘΄μ¬νλμ§ νμΈνμ¬ μ‘΄μ¬νλ©΄ ν΄λΉ μμλ₯Ό λ°ννκΈ°
curλ₯Ό νμfrontλ‘ μ§μ νλ€.리ν΄νκ² λ λ³μ
nodeλ₯Ό μ μΈνλ€.nodeμ νμ μμκ° ν λΉλ λ κΉμ§ λ°λ³΅λ¬Έμ μ€ννλ€.λ§μ½
curμ΄nullμ΄λΌλ©΄ ν΄λΉ μμκ° μκΈ° λλ¬Έμ μ무κ²λ λ°ννμ§ μκ³ ν¨μλ₯Ό μ’ λ£νλ€.curμ΄nullμ΄ λλ€λ κ²μ νμ λͺ¨λ μμλ₯Ό νμΈνλ€λ κ²μ΄λ€.cur.dataμcontainsν¨μμ μΈμλ‘ λ°μdataκ° κ°λ€λ©΄nodeμcurλ₯Ό ν λΉνλ€.nodeμcurλ₯Ό ν λΉνκ² λλ©΄nodeλnullμ΄ μλκΈ° λλ¬Έμ λ°λ³΅λ¬Έμ λ μ΄μ μ€νλμ§ μλλ€.νμ§λ§ κ°μ§ μλ€λ©΄
curλ₯Όcur.nextλ‘ λ°κΎΈμ΄ λ°λ³΅λ¬Έμ κ³μ μ€ννλ€.
3-6. νμ λͺ¨λ μμ μΆλ ₯νκΈ°
3-7. λ°°μ΄μ λ겨 ν μμ±νκΈ°
constructorν¨μλ₯Ό μμ κ°μ΄ μμ νμ¬ μλ‘μ΄ νλ₯Ό λ§λ€ λarrayκ° μ λ¬λλ©΄enqueueν¨μκ° μ€νλκ² νλ€.Array.forEach()λ©μλλ₯Ό μ¬μ©νμ¬ λ°°μ΄μ λͺ¨λ μμλ₯Ό νμ μμλ‘ λ£λλ€.(μμμ λΆν° μμλλ‘)
4. νμ μκ° λ³΅μ‘λ
enqueue(μΆκ°): νμ λ°μ΄ν°λ₯Ό μΆκ°νλ κ²μ νμ 맨 λ€ μμ(rear)μ νλλ₯Ό μΆκ°νλ©΄ λλ€. νμ 무μν λ§μ λ°μ΄ν°κ° μλλΌλ νλμ λ°μ΄ν° μ½μ μ ν λ²μ΄κΈ° λλ¬Έμ μκ° λ³΅μ‘λλ O(1)μ΄ λλ€.
dequeue(μμ ): FIFOμ λ°λΌ λ°μ΄ν°κ° μμ λ λ νμ 맨 μ μμ(front)κ° μμ λλ κ²μ΄λ―λ‘ νμ ν¬κΈ°μ μκ΄μμ΄ μκ° λ³΅μ‘λλ O(1)λ₯Ό κ°μ§κ² λλ€.
contains(μ κ·Όκ³Ό κ²μ): νμ 첫 λ²μ§Έ μμμ μ κ·Όμ μκ°λ³΅μ‘λ O(1)λ₯Ό κ°μ§λ€. νμ§λ§ νμ μμ μ κ·Όμ νμ 맨 μ μμ(front)μμλ§ κ°λ₯νκΈ° λλ¬Έμ nλ²μ§Έ μμμ μ κ·Όμ 첫 λ²μ§Έ μμ(front)λΆν° μννλ―λ‘ μκ° λ³΅μ‘λλ O(n)λ₯Ό κ°μ§κ² λλ€.
ν (Queue)
O(1)
O(1)
O(1)
O(n)
O(n)
5. Conclusion
νλ₯Ό μλ°μ€ν¬λ¦½νΈλ‘ ꡬν ν΄λ³΄λ©΄μ μ΄λ€ μλ£κ΅¬μ‘°μΈμ§ 곡λΆν΄λ³΄μλ€. νμ€ν λ°°μ΄κ³Όλ λ€λ₯Έ νΉμ§μ΄ μλ€. μμμ μΆκ°, μμ λ λΉ λ₯΄μ§λ§ μμμ μ κ·Ό, κ²μμ λ리기 λλ¬Έμ μν©μ λ§λ νμν μλ£κ΅¬μ‘°λ₯Ό μ μ νμ ν΄μΌκ² λ€. μ΄μ μ μ½λ© ν μ€νΈ 곡λΆλ₯Ό νλ©΄μ νμλ λ¬Έμ λ₯Ό μ‘°κΈ μμ νμλ€. κ·Έ μ΄μ λ κ·Έ λ λ¨μν λΈλ‘κ·Έμ μλ ν μμ±νλ ν΄λμ€λ₯Ό 볡μ¬λΆμ¬ λ£κΈ°λ₯Ό νκΈ° λλ¬Έμ΄λ€. λ΄κ° μ€μ€λ‘ λ§λ (λ¬Όλ‘ λΈλ‘κ·Έμ νμ λΉλ¦°κΈ΄ νμ§λ§..) ν ν΄λμ€λ₯Ό μ¬μ©νκ³ λ¬Έμ λ μ ν΅κ³Όλλ κ²μ 보λ μ¬λ°κ³ λΏλ―νλ€.
μ°Έκ³
[μλ£κ΅¬μ‘°] JSλ‘ κ΅¬ννλ ν (Queue) [μκ³ λ¦¬μ¦, μλ£κ΅¬μ‘°] μλ°μ€ν¬λ¦½νΈλ‘ ν(Queue)ꡬννκΈ° (+κ°λ μ΄ν΄)
π 2022-09-02
Last updated