Copy 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 ++ ;
}
}
} JAVA λλ νμ΄μ¬ κ°μ κ²½μ° λ΄μ₯ λΌμ΄λΈλ¬λ¦¬μ νλ₯Ό μ 곡νκ³ μμ§λ§ μλ°μ€ν¬λ¦½νΈ κ²½μ°μ κ·Έλ μ§ μλ€. κ·Έλμ μλ°μ€ν¬λ¦½νΈμμ νλ₯Ό μ¬μ©νκΈ° μν΄μλ μ§μ νλ₯Ό μμ±ν΄μΌνλ€.
μ¬μ€ μλ°μ€ν¬λ¦½νΈμμ νλ₯Ό μ¬μ©νμ§ μκ³ λ°°μ΄μ μ΄μ©νμ¬ νμ κΈ°λ₯μ μ¬μ©ν μ μλ€. Array.shift() λ©μλμ Array.pop() λ©μλλ₯Ό μ¬μ©νλ©΄ λλ€. νμ§λ§ μ΄λ κ² λλ©΄ μκ°λ³΅μ‘λμμ νμ ν° μ°¨μ΄λ₯Ό 보μ΄κ² λλ€. νμμμ μμ μ κ±°λ μκ°λ³΅μ‘λ O(1)λ₯Ό λ°λ₯΄κ² λλλ° λ°°μ΄μμμ Array.shift() λ©μλλ₯Ό μ¬μ©ν μμ μ κ±°λ μκ°λ³΅μλ O(n)λ₯Ό λ°λ₯΄κ² λκΈ° λλ¬Έμ΄λ€.
Array.shift() λ©μλμ λ΄λΆ λ‘μ§μ λ€μκ³Ό κ°λ€.
λ°°μ΄μ 첫 λ²μ§Έ μμμ μ κ·Όνμ¬ ν΄λΉ κ°μ λ°ννκ³ λ°°μ΄μμ μ κ±°
κΈ°μ‘΄ λ°°μ΄μμ 첫 λ²μ§Έ μμμ κ°μ μ¬λΌμ‘μ§λ§ 곡κ°μ μ°¨μ§νκ³ μμ
Array.shift() λ©μλλ κ³μν΄μ 첫 λ²μ§Έ μμμ μ κ·Όν μμ
λ°λΌμ λλ¨Έμ§ λ°°μ΄μ μμλ€μ μμΌλ‘ ν μΉΈμ© λΉκ²¨μ£Όλ κ³Όμ νμ
μ¦ λ§μ§λ§μ κ³Όμ μ λν μ°μ°μ΄ μΆκ°μ μΌλ‘ μꡬλλ€. μ΄λ¬ν μΆκ°μ μΈ μ°μ°μΌλ‘ μΈν΄ μ½λ© ν
μ€νΈ λ¬Έμ μμ λ°μ΄ν°μ μμ΄ λ§€μ° ν° κ²½μ°, μκ° λ³΅μ‘λλ₯Ό λ§€μ° μΈμΈνκ² κ΄λ¦¬ν΄μΌ νλ κ²½μ°μλ λ°°μ΄λ‘ μ΄μ©νμ¬ λ¬Έμ λ₯Ό νκ² λλ€λ©΄ ν΅κ³Όν μ μλ κ²½μ°κ° μμ μ μλ€. μ΄λ° κ²½μ° νλ₯Ό μ΄μ©νμ¬ λ λΉ λ₯Έ μκ° λ³΅μ‘λλ‘ λ¬Έμ μ μ κ·Όνλ€λ©΄ ν΅κ³Όν μ μλ νλ₯ μ΄ μ¬λΌκ° κ²μ΄λ€.
μ°Έκ³ ν λ§ν μ½λ© ν
μ€νΈ λ¬Έμ
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)λ₯Ό κ°μ§κ² λλ€.
Big-O (μκ°λ³΅μ‘λ)
μ½μ
μμ
첫 λ²μ§Έ μ κ·Ό
nλ²μ§Έ μ κ·Ό
κ²μ
νλ₯Ό μλ°μ€ν¬λ¦½νΈλ‘ ꡬν ν΄λ³΄λ©΄μ μ΄λ€ μλ£κ΅¬μ‘°μΈμ§ 곡λΆν΄λ³΄μλ€. νμ€ν λ°°μ΄κ³Όλ λ€λ₯Έ νΉμ§μ΄ μλ€. μμμ μΆκ°, μμ λ λΉ λ₯΄μ§λ§ μμμ μ κ·Ό, κ²μμ λ리기 λλ¬Έμ μν©μ λ§λ νμν μλ£κ΅¬μ‘°λ₯Ό μ μ νμ ν΄μΌκ² λ€. μ΄μ μ μ½λ© ν
μ€νΈ 곡λΆλ₯Ό νλ©΄μ νμλ λ¬Έμ λ₯Ό μ‘°κΈ μμ νμλ€. κ·Έ μ΄μ λ κ·Έ λ λ¨μν λΈλ‘κ·Έμ μλ ν μμ±νλ ν΄λμ€λ₯Ό 볡μ¬λΆμ¬ λ£κΈ°λ₯Ό νκΈ° λλ¬Έμ΄λ€. λ΄κ° μ€μ€λ‘ λ§λ (λ¬Όλ‘ λΈλ‘κ·Έμ νμ λΉλ¦°κΈ΄ νμ§λ§..) ν ν΄λμ€λ₯Ό μ¬μ©νκ³ λ¬Έμ λ μ ν΅κ³Όλλ κ²μ 보λ μ¬λ°κ³ λΏλ―νλ€.
[μλ£κ΅¬μ‘°] JSλ‘ κ΅¬ννλ ν (Queue)arrow-up-right
[μκ³ λ¦¬μ¦, μλ£κ΅¬μ‘°] μλ°μ€ν¬λ¦½νΈλ‘ ν(Queue)ꡬννκΈ° (+κ°λ
μ΄ν΄)arrow-up-right
π
2022-09-02