1. ํ
- **FIFO(First In First Out)**์ด๋ผ๋ ๊ฐ๋ ์ ๊ฐ์ง ์ ํ ์๋ฃ๊ตฌ์กฐ
- ๋จผ์ ๋ค์ด๊ฐ ๊ฒ์ด ๋จผ์ ๋์ค๊ณ , ๋์ค์ ๋ค์ด๊ฐ ๊ฒ์ด ๋์ค์ ๋์จ๋ค.
- Linear Queue์ Circular Queue๊ฐ ์กด์ฌํ๋ค.
- e.g.์ค์๊ธฐ๋ฅผ ์๊ฐํ๋ฉด ํธํ๋ค.

1.1 ํ์ ๊ธฐ๋ณธ ์ฐ์ฐ

Enqueue: ํ ๋งจ ๋ค์ ์์๋ฅผ ์ถ๊ฐDequeue: ํ ๋งจ ์์ ์์๋ฅผ ์ญ์ Peek: front์ ์์นํ ๋ฐ์ดํฐ๋ฅผ ํ์ธfront: ํ์ ๋งจ ์ ์์นrear: ํ์ ๋งจ ๋ค ์์น
2. ์ ํ ํ(Linear Queue)
2.1 ํํ
2.1.1 Array๋ก ํํํ๊ธฐ
- Linear Queue๋ฅผ Array๋ก ํํํ ์ ์๋ค.
- ๋ฐฐ์ด์ด๊ธฐ ๋๋ฌธ์ ๋น ๊ณต๊ฐ์ ๋ฉ๊ฟ์ง์ง ์์ต๋๋ค.
- ์ ์ธํ ๋ฐฐ์ด๋งํผ๋ง ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ ์ฐจ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์
- JavaScript์์๋ ๋ฐฐ์ด์ด ์์ ๋กญ๊ฒ ์ฆ๊ฐ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๋ฌธ์ ๋ ์๊ฒ ์ง๋ง, Font์ Rear๊ฐ ๋ฌดํ์ ์ปค์ง ์ ์๋ค๋ ๋ฌธ์ ์ ์ด ์กด์ฌ

2.1.2 Linked List๋ก ํํํ๊ธฐ
- Linear Queue๋ฅผ Linked List๋ก ํํํ ์ ์๋ค.
- Array ๊ตฌํ์ ๋จ์ ์ ํด๊ฒฐํ ๋ฐฉ์์ผ๋ก ์ธ๋ฑ์ค์ ๊ณ ๋ฏผ์ ํ ํ์๊ฐ ์์

2.3 ๊ตฌํ
2.3.1 Array๋ก ๊ตฌํ
๊ตฌํ์ด ๊ฐ๋จํ๊ธฐ ๋๋ฌธ์ ์ฝ๋ฉํ ์คํธ์ ๊ตฌํํ ๋ ์ถ์ฒ! ๋จ, ์์ ๋งํ ๊ฒ์ฒ๋ผ Font์ Rear๊ฐ ๋ฌดํ์ ์ปค์ง ์ ์๋ค๋ ๋ฌธ์ ์ ์ด ์กด์ฌํฉ๋๋ค.
1class Queue {2// ์์ฑ์: new ํค์๋๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ํธ์ถ๋๋ ํจ์3constructor() {4this.queue = [] // ์์๋ฅผ ๋ฃ์ ๋ฐฐ์ด ๋ณ์5this.front = 0 // front ํฌ์ธํฐ6this.rear = 0 // rear ํฌ์ธํฐ7}8// ๐ ๋ฃ๊ธฐ9enqueue(value) {10// ์คํ๋ ธ๋[rear๋ณ์ ์ฆ๊ฐ] = ์ ๋ ฅ๋ฐ์ ๊ฐ11this.queue[this.rear++] = value12}1314// ๐ ๋นผ๊ธฐ15dequeue() {16const value = this.queue[this.front] // ์คํ๋ ธ๋[front๊ฐ]์ ๋ฐ์์ค๊ธฐ17delete this.queue[this.front] // ์คํ๋ ธ๋์ front ์ญ์ 18this.front += 119return value20}2122// ๐ ํ์ ๊ฐ์ฅ ์์ ์๋ ๋ ธ๋ ๋ฐํ23peek() {24return this.queue[this.front]25}2627// ๐ ํ์ ํฌ๊ธฐ ๋ฐํ28size() {29return this.rear - this.front30}31}3233const queue = new Queue()34queue.enqueue(1)35queue.enqueue(2)36queue.enqueue(4)37console.log(queue.dequeue()) // 138queue.enqueue(8)39console.log(queue.size()) // 340console.log(queue.peek()) // 241console.log(queue.dequeue()) // 242console.log(queue.dequeue()) // 4
2.3.2 Linked List๋ก ๊ตฌํ
Array ๊ตฌํ์ ๋จ์ ์ ํด๊ฒฐํ ๋ฐฉ์์ ๋๋ค.
1class Node {2// ์์ฑ์: new ํค์๋๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ํธ์ถ๋๋ ํจ์3constructor(value) {4this.value = value5this.next = null6}7}89class Queue {10constructor() {11this.head = null12this.tail = null13this.size = 014}1516// ๐ ๋ฃ๊ธฐ17enqueue(newValue) {18const newNode = new Node(newValue)19// ํด๋น ํ๊ฐ ๋น ๋ ธ๋๋ผ๋ฉด20if (this.head == null) {21this.head = this.tail = newNode22} else {23this.tail.next = newNode24this.tail = newNode25}26this.size += 127}2829// ๐ ๋นผ๊ธฐ30dequeue() {31const value = this.head.value32this.head = this.head.next33this.size -= 134return value35}3637// ๐ ํ์ ๊ฐ์ฅ ์์ ์๋ ๋ ธ๋ ๋ฐํ38peek() {39return this.head.value40}4142// ๐ ํ์ ํฌ๊ธฐ ๋ฐํ43size() {44return this.rear - this.front45}46}4748const queue = new Queue()49queue.enqueue(1)50queue.enqueue(2)51queue.enqueue(4)52console.log(queue.dequeue()) // 153queue.enqueue(8)54console.log(queue.size()) // 355console.log(queue.peek()) // 256console.log(queue.dequeue()) // 257console.log(queue.dequeue()) // 4
2.3.3 shift
๊ฐํน JS์์ ํ ๊ตฌํ์ ๊ฒ์ํ๋ฉด, shift()๋ก ํ๋ฅผ ๊ตฌํํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์๋ชป๋ ์ ๋ณด์ ๋๋ค. JS์์ shift๋ ์ ํ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ํ์์ ๊ธฐ๋ํ๋ ๋ก์ง์ด ์ํ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ํ๋ฅผ ์ธ ๋ shift ํจ์๋ ์ฐ์ง ๋ง์ธ์.
1const queue = [1, 2, 3]2queue.push(4)3const value = queue.shift() // O(n) !!4console.log(value) // 1
3. ํํ ํ(Circular Queue)
- Front์ Rear๊ฐ ์ด์ด์ ธ ์๋ Queue
- Circular Queue๋ ํ์ ๋ ๊ณต๊ฐ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ๋ ์ฌ์ฉ
- Circular Queue๋ Linked List๋ก ๊ตฌํํ์ ๋ ์ด์ ์ด ์๋ค.

3.1 ๊ตฌํ
3.1.1 Array๋ก ๊ตฌํ
์ฝ๋ฉํ ์คํธ์์ ํํ ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ง์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ผญ ์ธ์ธ ํ์๋ ์์ต๋๋ค.
1class Queue {2// ์์ฑ์: new ํค์๋๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ํธ์ถ๋๋ ํจ์3constructor(maxSize) {4this.maxSize = maxSize5this.queue = []6this.front = 07this.rear = 08this.size = 09}1011// ๐ ๋ฃ๊ธฐ12enqueue(value) {13if (this.isFull()) {14console.log('Queue is full.')15return16}17this.queue[this.rear] = value18this.rear = (this.rear + 1) % this.maxSize19this.size += 120}2122// ๐ ๋นผ๊ธฐ23dequeue() {24const value = this.queue[this.front]25delete this.queue[this.front]26this.front = (this.front + 1) % this.maxSize27this.size -= 128return value29}3031isFull() {32return this.size === this.maxSize33}3435// ๐ ํ์ ๊ฐ์ฅ ์์ ์๋ ๋ ธ๋ ๋ฐํ36peek() {37return this.queue[this.front]38}39}40const queue = new Queue(4)41queue.enqueue(1)42queue.enqueue(2)43queue.enqueue(4)44queue.enqueue(8)45queue.enqueue(16) // Queue is full.46console.log(queue.dequeue()) // 147console.log(queue.dequeue()) // 248console.log(queue.size) // 249console.log(queue.peek()) // 450queue.enqueue(16)51queue.enqueue(32)52console.log(queue.isFull()) // true
4. ํ ์ค์ต : ํ๋ฆฐํฐ
4.1 ๋ฌธ์
4.2 ํ์ด
1class Node {2constructor(value) {3this.value = value4this.next = null5}6}7class Queue {8constructor() {9this.head = null10this.tail = null11}12enqueue(newValue) {13const newNode = new Node(newValue)14if (this.head === null) {15this.head = this.tail = newNode16} else {17this.tail.next = newNode18this.tail = newNode19}20}21dequeue() {22const value = this.head.value23this.head = this.head.next24return value25}26peek() {27return this.head.value28}29}3031function solution(priorities, location) {32const queue = new Queue() // ํ ์์ฑ3334// ๋๊ธฐ๋ชฉ๋ก๋งํผ ์ํ35for (let i = 0; i < priorities.length; i += 1) {36queue.enqueue([priorities[i], i]) // ๊ฐ๊ฐ์ ์ฐ์ ์์์ ์ธ๋ฑ์ค37}38priorities.sort((a, b) => b - a) // ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ3940let count = 0 // ๋ด๊ฐ ์ธ์๋ฅผ ์์ฒญํ ๋ฌธ์๊ฐ ๋ช ๋ฒ์งธ๋ก ์ธ์๋๋์ง4142// ํ๊ฐ ๋น์ด์์ ๋๊น์ง ๋ฐ๋ณต43while (true) {44const currentValue = queue.peek() // ๊ฐ์ฅ ์์ ๋ ธ๋ ๋ฐํ4546// ์ง๊ธ๊น์ง ์ํํ ์ฐ์ ์์๋ณด๋ค ์์ ๊ฒฝ์ฐ47if (currentValue[0] < priorities[count]) {48queue.enqueue(queue.dequeue()) // ๊ทธ ๊ฐ์ ๋งจ ๋ค์ ๋ฃ๊ธฐ49} else {50const value = queue.dequeue() // ์ฐ์ ์์๊ฐ ๋ ํฐ ๊ฒฝ์ฐ, ๋ฐ๋ก dequeue51count += 15253// ๋ฝ์ ๋ฌธ์๊ฐ ๋ด๊ฐ ์ฐพ์ ๋ฌธ์๋ผ๋ฉด54if (location === value[1]) {55return count56}57}58}59}