๐ŸŽ‰ berenickt ๋ธ”๋กœ๊ทธ์— ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
CS
์ž๋ฃŒ๊ตฌ์กฐ&์•Œ๊ณ ๋ฆฌ์ฆ˜-js
06-queue(ํ)

1. ํ

  • **FIFO(First In First Out)**์ด๋ผ๋Š” ๊ฐœ๋…์„ ๊ฐ€์ง„ ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ
  • ๋จผ์ € ๋“ค์–ด๊ฐ„ ๊ฒƒ์ด ๋จผ์ € ๋‚˜์˜ค๊ณ , ๋‚˜์ค‘์— ๋“ค์–ด๊ฐ„ ๊ฒƒ์ด ๋‚˜์ค‘์— ๋‚˜์˜จ๋‹ค.
  • Linear Queue์™€ Circular Queue๊ฐ€ ์กด์žฌํ•œ๋‹ค.
    • e.g.์ค„์„œ๊ธฐ๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค.

Data Structure_6_1


1.1 ํ์˜ ๊ธฐ๋ณธ ์—ฐ์‚ฐ

Data Structure_6_2

  • Enqueue: ํ ๋งจ ๋’ค์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€
  • Dequeue: ํ ๋งจ ์•ž์˜ ์š”์†Œ๋ฅผ ์‚ญ์ œ
  • Peek: front์— ์œ„์น˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธ
  • front: ํ์˜ ๋งจ ์•ž ์œ„์น˜
  • rear: ํ์˜ ๋งจ ๋’ค ์œ„์น˜

2. ์„ ํ˜• ํ(Linear Queue)

2.1 ํ‘œํ˜„

2.1.1 Array๋กœ ํ‘œํ˜„ํ•˜๊ธฐ

  • Linear Queue๋ฅผ Array๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋นˆ ๊ณต๊ฐ„์€ ๋ฉ”๊ฟ”์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์„ ์–ธํ•œ ๋ฐฐ์—ด๋งŒํผ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋“ ์ฐจ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ
  • JavaScript์—์„œ๋Š” ๋ฐฐ์—ด์ด ์ž์œ ๋กญ๊ฒŒ ์ฆ๊ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ฌธ์ œ๋Š” ์—†๊ฒ ์ง€๋งŒ, Font์™€ Rear๊ฐ€ ๋ฌดํ•œ์ • ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์กด์žฌ

Data Structure_6_3


2.1.2 Linked List๋กœ ํ‘œํ˜„ํ•˜๊ธฐ

  • Linear Queue๋ฅผ Linked List๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Array ๊ตฌํ˜„์˜ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•œ ๋ฐฉ์‹์œผ๋กœ ์ธ๋ฑ์Šค์˜ ๊ณ ๋ฏผ์€ ํ•  ํ•„์š”๊ฐ€ ์—†์Œ

Data Structure_6_4


2.3 ๊ตฌํ˜„

2.3.1 Array๋กœ ๊ตฌํ˜„

๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์— ๊ตฌํ˜„ํ•  ๋–„ ์ถ”์ฒœ! ๋‹จ, ์•ž์„œ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ Font์™€ Rear๊ฐ€ ๋ฌดํ•œ์ • ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

1
class Queue {
2
// ์ƒ์„ฑ์ž: new ํ‚ค์›Œ๋“œ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ• ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
3
constructor() {
4
this.queue = [] // ์š”์†Œ๋ฅผ ๋„ฃ์„ ๋ฐฐ์—ด ๋ณ€์ˆ˜
5
this.front = 0 // front ํฌ์ธํ„ฐ
6
this.rear = 0 // rear ํฌ์ธํ„ฐ
7
}
8
// ๐Ÿ“ ๋„ฃ๊ธฐ
9
enqueue(value) {
10
// ์‹คํ–‰๋…ธ๋“œ[rear๋ณ€์ˆ˜ ์ฆ๊ฐ] = ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’
11
this.queue[this.rear++] = value
12
}
13
14
// ๐Ÿ“ ๋นผ๊ธฐ
15
dequeue() {
16
const value = this.queue[this.front] // ์‹คํ–‰๋…ธ๋“œ[front๊ฐ’]์„ ๋ฐ›์•„์˜ค๊ธฐ
17
delete this.queue[this.front] // ์‹คํ–‰๋…ธ๋“œ์˜ front ์‚ญ์ œ
18
this.front += 1
19
return value
20
}
21
22
// ๐Ÿ“ ํ์˜ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๋…ธ๋“œ ๋ฐ˜ํ™˜
23
peek() {
24
return this.queue[this.front]
25
}
26
27
// ๐Ÿ“ ํ์˜ ํฌ๊ธฐ ๋ฐ˜ํ™˜
28
size() {
29
return this.rear - this.front
30
}
31
}
32
33
const queue = new Queue()
34
queue.enqueue(1)
35
queue.enqueue(2)
36
queue.enqueue(4)
37
console.log(queue.dequeue()) // 1
38
queue.enqueue(8)
39
console.log(queue.size()) // 3
40
console.log(queue.peek()) // 2
41
console.log(queue.dequeue()) // 2
42
console.log(queue.dequeue()) // 4

2.3.2 Linked List๋กœ ๊ตฌํ˜„

Array ๊ตฌํ˜„์˜ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

1
class Node {
2
// ์ƒ์„ฑ์ž: new ํ‚ค์›Œ๋“œ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ• ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
3
constructor(value) {
4
this.value = value
5
this.next = null
6
}
7
}
8
9
class Queue {
10
constructor() {
11
this.head = null
12
this.tail = null
13
this.size = 0
14
}
15
16
// ๐Ÿ“ ๋„ฃ๊ธฐ
17
enqueue(newValue) {
18
const newNode = new Node(newValue)
19
// ํ•ด๋‹น ํ๊ฐ€ ๋นˆ ๋…ธ๋“œ๋ผ๋ฉด
20
if (this.head == null) {
21
this.head = this.tail = newNode
22
} else {
23
this.tail.next = newNode
24
this.tail = newNode
25
}
26
this.size += 1
27
}
28
29
// ๐Ÿ“ ๋นผ๊ธฐ
30
dequeue() {
31
const value = this.head.value
32
this.head = this.head.next
33
this.size -= 1
34
return value
35
}
36
37
// ๐Ÿ“ ํ์˜ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๋…ธ๋“œ ๋ฐ˜ํ™˜
38
peek() {
39
return this.head.value
40
}
41
42
// ๐Ÿ“ ํ์˜ ํฌ๊ธฐ ๋ฐ˜ํ™˜
43
size() {
44
return this.rear - this.front
45
}
46
}
47
48
const queue = new Queue()
49
queue.enqueue(1)
50
queue.enqueue(2)
51
queue.enqueue(4)
52
console.log(queue.dequeue()) // 1
53
queue.enqueue(8)
54
console.log(queue.size()) // 3
55
console.log(queue.peek()) // 2
56
console.log(queue.dequeue()) // 2
57
console.log(queue.dequeue()) // 4

2.3.3 shift

๊ฐ„ํ˜น JS์—์„œ ํ ๊ตฌํ˜„์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด, shift()๋กœ ํ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ์ž˜๋ชป๋œ ์ •๋ณด์ž…๋‹ˆ๋‹ค. JS์—์„œ shift๋Š” ์„ ํ˜• ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ํ์—‘์„œ ๊ธฐ๋Œ€ํ•˜๋Š” ๋กœ์ง์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ๋ฅผ ์“ธ ๋–„ shift ํ•จ์ˆ˜๋Š” ์“ฐ์ง€ ๋งˆ์„ธ์š”.

1
const queue = [1, 2, 3]
2
queue.push(4)
3
const value = queue.shift() // O(n) !!
4
console.log(value) // 1

3. ํ™˜ํ˜• ํ(Circular Queue)

  • Front์™€ Rear๊ฐ€ ์ด์–ด์ ธ ์žˆ๋Š” Queue
  • Circular Queue๋Š” ํ•œ์ •๋œ ๊ณต๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๋–„ ์‚ฌ์šฉ
  • Circular Queue๋Š” Linked List๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ ์ด์ ์ด ์—†๋‹ค.

Data Structure_6_5


3.1 ๊ตฌํ˜„

3.1.1 Array๋กœ ๊ตฌํ˜„

์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ํ™˜ํ˜• ํ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ผญ ์™ธ์šธ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

1
class Queue {
2
// ์ƒ์„ฑ์ž: new ํ‚ค์›Œ๋“œ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ• ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
3
constructor(maxSize) {
4
this.maxSize = maxSize
5
this.queue = []
6
this.front = 0
7
this.rear = 0
8
this.size = 0
9
}
10
11
// ๐Ÿ“ ๋„ฃ๊ธฐ
12
enqueue(value) {
13
if (this.isFull()) {
14
console.log('Queue is full.')
15
return
16
}
17
this.queue[this.rear] = value
18
this.rear = (this.rear + 1) % this.maxSize
19
this.size += 1
20
}
21
22
// ๐Ÿ“ ๋นผ๊ธฐ
23
dequeue() {
24
const value = this.queue[this.front]
25
delete this.queue[this.front]
26
this.front = (this.front + 1) % this.maxSize
27
this.size -= 1
28
return value
29
}
30
31
isFull() {
32
return this.size === this.maxSize
33
}
34
35
// ๐Ÿ“ ํ์˜ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๋…ธ๋“œ ๋ฐ˜ํ™˜
36
peek() {
37
return this.queue[this.front]
38
}
39
}
40
const queue = new Queue(4)
41
queue.enqueue(1)
42
queue.enqueue(2)
43
queue.enqueue(4)
44
queue.enqueue(8)
45
queue.enqueue(16) // Queue is full.
46
console.log(queue.dequeue()) // 1
47
console.log(queue.dequeue()) // 2
48
console.log(queue.size) // 2
49
console.log(queue.peek()) // 4
50
queue.enqueue(16)
51
queue.enqueue(32)
52
console.log(queue.isFull()) // true

4. ํ ์‹ค์Šต : ํ”„๋ฆฐํ„ฐ

4.1 ๋ฌธ์ œ


4.2 ํ’€์ด

1
class Node {
2
constructor(value) {
3
this.value = value
4
this.next = null
5
}
6
}
7
class Queue {
8
constructor() {
9
this.head = null
10
this.tail = null
11
}
12
enqueue(newValue) {
13
const newNode = new Node(newValue)
14
if (this.head === null) {
15
this.head = this.tail = newNode
16
} else {
17
this.tail.next = newNode
18
this.tail = newNode
19
}
20
}
21
dequeue() {
22
const value = this.head.value
23
this.head = this.head.next
24
return value
25
}
26
peek() {
27
return this.head.value
28
}
29
}
30
31
function solution(priorities, location) {
32
const queue = new Queue() // ํ ์ƒ์„ฑ
33
34
// ๋Œ€๊ธฐ๋ชฉ๋ก๋งŒํผ ์ˆœํšŒ
35
for (let i = 0; i < priorities.length; i += 1) {
36
queue.enqueue([priorities[i], i]) // ๊ฐ๊ฐ์˜ ์šฐ์„ ์ˆœ์œ„์™€ ์ธ๋ฑ์Šค
37
}
38
priorities.sort((a, b) => b - a) // ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
39
40
let count = 0 // ๋‚ด๊ฐ€ ์ธ์‡„๋ฅผ ์š”์ฒญํ•œ ๋ฌธ์„œ๊ฐ€ ๋ช‡ ๋ฒˆ์งธ๋กœ ์ธ์‡„๋˜๋Š”์ง€
41
42
// ํ๊ฐ€ ๋น„์–ด์žˆ์„ ๋–„๊นŒ์ง€ ๋ฐ˜๋ณต
43
while (true) {
44
const currentValue = queue.peek() // ๊ฐ€์žฅ ์•ž์— ๋…ธ๋“œ ๋ฐ˜ํ™˜
45
46
// ์ง€๊ธˆ๊นŒ์ง€ ์ˆ˜ํ–‰ํ•œ ์šฐ์„ ์ˆœ์œ„๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ
47
if (currentValue[0] < priorities[count]) {
48
queue.enqueue(queue.dequeue()) // ๊ทธ ๊ฐ’์„ ๋งจ ๋’ค์— ๋„ฃ๊ธฐ
49
} else {
50
const value = queue.dequeue() // ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ํฐ ๊ฒฝ์šฐ, ๋ฐ”๋กœ dequeue
51
count += 1
52
53
// ๋ฝ‘์€ ๋ฌธ์„œ๊ฐ€ ๋‚ด๊ฐ€ ์ฐพ์€ ๋ฌธ์„œ๋ผ๋ฉด
54
if (location === value[1]) {
55
return count
56
}
57
}
58
}
59
}

[์ฐธ๊ณ ]