[JavaScript-์ž๋ฃŒ๊ตฌ์กฐ] Queue

Hannahhhยท2022๋…„ 9์›” 20์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
40/47

๐Ÿ” Queue


๋Œ€๊ธฐํ–‰๋ ฌ์ด๋ผ๋Š” ์˜๋ฏธ๋กœ, ๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜๊ฐˆ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋Š” ๋‚˜๊ฐˆ ์ˆ˜ ์—†๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

์ฆ‰, ๊ฐ€์žฅ ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜๊ฐ€๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด์ „์— ๋ฐ์ดํ„ฐ๋“ค์ด ๋ชจ๋‘ ๋น ์ ธ๋‚˜๊ฐ€๊ธฐ ์ „๊นŒ์ง€๋Š” ๋‚˜๊ฐˆ ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ, Stack๊ณผ๋Š” ๋ฐ˜๋Œ€๋˜๋Š” ๊ฐœ๋…์œผ๋กœ, ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜์˜ค๊ณ (FIFO), ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋Š” ๋‚˜์ค‘์— ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค(LILO).

์ด ๋•Œ, Queue์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์„ enqueue, ๊บผ๋‚ด๋Š” ๊ฒƒ์„ dequeue๋ผ๊ณ  ํ•œ๋‹ค.



Queue์˜ ํŠน์ง•์„ ์ •๋ฆฌํ•˜์ž๋ฉด, ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • FIFO (First In First Out) = ์„ ์ž…์„ ์ถœ

  • ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋ฌด๋ฆฌ ๋งŽ์•„๋„ ํ•˜๋‚˜์”ฉ ๋„ฃ๊ณ  ๋บ„ ์ˆ˜ ์žˆ๋‹ค. (ํ•œ๊บผ๋ฒˆ์— ์—ฌ๋Ÿฌ๊ฐœ X)

  • ๋‘ ๊ฐœ์˜ ์ž…์ถœ๋ ฅ ๋ฐฉํ–ฅ(์ž…๋ ฅ ๋”ฐ๋กœ, ์ถœ๋ ฅ ๋”ฐ๋กœ)



โœ” ๊ธฐ๋ณธ ์ฝ”๋“œ

class Queue {
  constructor() {
    this.storage = {};
    this.front = 0;
    this.rear = 0;
  }

  // ์ถ”๊ฐ€๋  ๋•Œ -> rear์˜ ๊ฐ’์ด ์ปค์ง€๊ณ 
  // ์‚ญ์ œ ๋  ๋•Œ -> front ๋ณ€๊ฒฝ
  size() {
    return this.rear-this.front;
  }
  
  // queue์— element(๋ฐ์ดํ„ฐ)์ถ”๊ฐ€
  // key : ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋  element์˜ index๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” this.rear
  // value : element
  // key์™€ value๋ฅผ storage์— ํ• ๋‹นํ•˜๊ณ , this.rear์€ ๋‹ค์Œ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜์—ฌ ์ƒˆ๋กœ์šด element์— ๋Œ€๋น„
  enqueue(element) {
    this.storage[this.rear] = element;
    this.rear += 1;
  }
	

// ๊ฐ€์žฅ ๋‚˜์ค‘์— ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์™€์•ผ ํ•œ๋‹ค.
  // queue์—์„œ element๋ฅผ ์ œ๊ฑฐ ํ•œ ๋’ค, ํ•ด๋‹น element๋ฅผ return.
  // ๋งŒ์•ฝ size๊ฐ€ 0์ด๋ผ๋ฉด ์•„๋ฌด๊ฒƒ๋„ return ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  // this.front(๊ฐ€์žฅ ๋จผ์ € ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” index)๋กœ ์ตœํ•˜๋‹จ์„ ์„ค์ •ํ•œ ํ›„ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ , queue์—์„œ ์ œ๊ฑฐ.
  // ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ–ˆ์œผ๋‹ˆ front+1(๋‹ค์Œ ์š”์†Œ์˜ index๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•จ)
  
  dequeue() {
    if (this.size() <= 0) {
      return;
    }

    const result = this.storage[this.front];
    delete this.storage[this.front];
    this.front += 1;

    return result;
  }
}

// ์ž…์ถœ๋ ฅ
const queue = new Queue();

queue.size(); // 0
for(let i = 1; i < 10; i++) {
  	queue.enqueue(i);
}
queue.dequeue(); // 1
queue.dequeue(); // 2
queue.size(); // 7
queue.enqueue(10);
queue.size(); // 8
queue.dequeue(); // 3
queue.dequeue(); // 4
queue.size(); // 6
...




๐Ÿ‘€ ์‹ค์‚ฌ์šฉ ์˜ˆ์‹œ


โœ” Printer


Printer์—์„œ ์—ฌ๋Ÿฌ ๋ฌธ์„œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ธ์‡„ํ•˜๋ ค๋ฉด ์•„๋ž˜์˜ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

  1. ๋ฌธ์„œ ์ž‘์„ฑ ํ›„, ์ถœ๋ ฅ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๊ธฐ -> ํ•ด๋‹น ๋ฌธ์„œ๊ฐ€ ์ธ์‡„ ์ž‘์—…(์ž„์‹œ ๊ธฐ์–ต ์žฅ์น˜์˜) queue๋กœ ๋“ค์–ด๊ฐ„๋‹ค.

  2. ์ธ์‡„ ์ž‘์—… queue์— ๋“ค์–ด์˜จ ๋ฌธ์„œ์˜ ์ˆœ์„œ๋Œ€๋กœ ์ธ์‡„ํ•œ๋‹ค.

์œ„์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ, ๊ฐ ์žฅ์น˜ ์‚ฌ์ด์˜ ์†๋„๋‚˜ ์‹œ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๊ทน๋ณตํ•˜๊ณ  ์ˆœ์„œ๋Œ€๋กœ ๊ฒฐ๊ณผ๋ฌผ์„ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ์ž„์‹œ ๊ธฐ์–ต ์žฅ์น˜์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ Queue๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ†ตํ‹€์–ด ๋ฒ„ํผ(buffer) ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.



๊ตฌํ˜„ ์ฝ”๋“œ

function queuePrinter(bufferSize, capacities, documents) {

  // ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋“ค ์„ ์–ธ
	// time = ์‹œ๊ฐ„์ด ์–ผ๋งˆ๋‚˜ ์ง€๋‚ฌ๋Š”์ง€ ๊ธฐ๋ก
  let time = 0
	// queue = ์ธ์‡„ ๋Œ€๊ธฐ ๋ชฉ๋ก
  let queue = []
	// total = ๋Œ€๊ธฐ ๋ชฉ๋ก(queue)์— ๋“ค์–ด์žˆ๋Š” ๋ฌธ์„œ์˜ ์ด ์šฉ๋Ÿ‰
  let total = 0

// go = 1์ดˆ๋งˆ๋‹ค ๋ฒŒ์–ด์งˆ ์ผ์„ ๋‹ด์„ ํ•จ์ˆ˜
  const go = () => {

		// 1์ดˆ ์ง€๋‚จ
    time += 1

		// ๋Œ€๊ธฐ ๋ชฉ๋ก ๋งจ ์•ž์— ์žˆ๋˜ ๋ฌธ์„œ๋ฅผ ๋นผ์„œ printed๋ผ๋Š” ๋ณ€์ˆ˜์— ๋‹ด๊ธฐ
    let printed = queue.shift()

		// ํ”„๋ฆฐํŠธํ•  ๋ฌธ์„œ๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด printed๋ผ๋Š” ๋ณ€์ˆ˜์— ๊ฐ’์ด ์กด์žฌ
		// ๊ฐ’ = ์ธ์‡„๋œ ๋ฌธ์„œ์˜ ์šฉ๋Ÿ‰
		// ๋”ฐ๋ผ์„œ ์ด ์šฉ๋Ÿ‰ total์—์„œ ์ธ์‡„๋œ ๋ฌธ์„œ ์šฉ๋Ÿ‰์„ ๋นผ์ค€๋‹ค
    if(printed){
      total = total - printed;
    }

		// ๋Œ€๊ธฐ ๋ชฉ๋ก์— ๋‹ค๋ฅธ ๋ฌธ์„œ๋ฅผ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ
		// ์ด ์šฉ๋Ÿ‰ + ์ธ์‡„ํ•ด์•ผ ํ•  ๋ฆฌ์ŠคํŠธ 0๋ฒˆ์งธ ๋ฌธ์„œ์˜ ์šฉ๋Ÿ‰์€ capacities์˜ ๊ฐ’๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ์ž‘์•„์•ผ ํ•จ.
    if (total + documents[0] <= capacities) {
			// ๋ฆฌ์ŠคํŠธ์— ์žˆ๋˜ ๋ฌธ์„œ๋ฅผ ๋นผ์„œ
      let document = documents.shift()
			// ๋Œ€๊ธฐ ๋ชฉ๋ก ๋งˆ์ง€๋ง‰ ์นธ์— ๋ฌธ์„œ๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ 
      queue[bufferSize-1] = document
			// ์ด ์šฉ๋Ÿ‰ + ๋„ฃ์–ด์ค€ ๋ฌธ์„œ ์šฉ๋Ÿ‰
      total += document
    }
  }

	// ๋ฌธ์„œ๋ฆฌ์ŠคํŠธ์— ๋ฌธ์„œ๊ฐ€ ์žˆ๊ฑฐ๋‚˜,
	// ์ธ์‡„ ๋Œ€๊ธฐ ๋ชฉ๋ก์— ์•„์ง ์ธ์‡„๋˜์ง€ ์•Š์€ ๋ฌธ์„œ๊ฐ€ ๋‚จ์•„์žˆ์„ ๋•Œ
  while (documents.length || queue.length) {
		// 1์ดˆ๋งˆ๋‹ค ๋ฒŒ์–ด์งˆ ์ผ์„ ๋‹ด์„ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ์คŒ
    go()
  }

	// ๋” ์ด์ƒ ์ธ์‡„ํ•  ๋ฌธ์„œ๋„, ์ธ์‡„ ๋Œ€๊ธฐ์ค‘์ธ ๋ฌธ์„œ๋„ ์—†์„ ๋•Œ
	// ์ด ์†Œ๋ชจ์‹œ๊ฐ„์ธ time์„ return
  return time
}

// ์ž…์ถœ๋ ฅ
let bufferSize = 2;
let capacities = 10;
let documents = [7, 4, 5, 6];

let output = queuePrinter(bufferSize, capacities, documents);
console.log(output) // 8




Reference: ์ฝ”๋“œ์Šคํ…Œ์ด์ธ 

0๊ฐœ์˜ ๋Œ“๊ธ€