Frontend/JavaScript

[JavaScript] ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ํ(Queue) ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

_์„ฑํ˜ธ_ 2023. 3. 21. 23:58
728x90
๋ฐ˜์‘ํ˜•

ํ(Queue)๋ž€?

ํ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋กœ, ๋จผ์ € ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ์ถœ๋ ฅ๋˜๋Š” "์„ ์ž…์„ ์ถœ(FIFO: First-In-First-Out)" ์›์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

 

ํ(Queue)์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• 2๊ฐ€์ง€

ํ๋Š” ๋ฐฐ์—ด(Array)์ด๋‚˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ ๋ฐฐ์—ด

๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์–ด์„œ ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ์— ์ œํ•œ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฐ์‚ฐ ์†๋„๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค.

2๏ธโƒฃ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ํฌ๊ธฐ์— ์ œํ•œ์ด ์—†์–ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฐ์‚ฐ ์†๋„๊ฐ€ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

 

๐Ÿง ๋ฐฐ์—ด๋กœ ํ(Queue)๋ฅผ ๊ตฌํ˜„ํ•ด๋„ ๋˜์ง€๋งŒ ๊ตณ์ด ? ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ด์œ  

JavaScript์—์„œ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ํ(Queue)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋ฐฐ์—ด์˜ ๋งจ ์•ž์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•œ ์นธ์”ฉ ์ด๋™์‹œ์ผœ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. (์‹œ๊ฐ„ ๋ณต์žก๋„ O(n)) ๋ฐ˜๋ฉด์— ์Šคํƒ(Stack)์€ ๋ฐฐ์—ด์˜ ๋งจ ๋์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž… ๋ฐ ์ œ๊ฑฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ํ(Queue) ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

class Node {
  constructor(data) {
    // ๋…ธ๋“œ ๊ฐ’
    this.data = data;
    // ๋‹ค์Œ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ €์žฅ
    this.next = null;
  }
}

class Queue {
  constructor() {
    // ํ์˜ ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ
    this.head = null;
    // ํ์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ
    this.tail = null;
    // ํ์˜ ๊ธธ์ด
    this.size = 0;
  }

  enqueue(data) {
    // ์ƒˆ๋กœ์šด ๋…ธ๋“œ ์ƒ์„ฑ
    const newNode = new Node(data);

    // ํ๊ฐ€ ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ head์™€ tail์„ ๋ชจ๋‘ ์ƒˆ ๋…ธ๋“œ๋กœ ์„ค์ •
    // ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ˜„์žฌ tail์˜ next ์†์„ฑ์„ ์ƒˆ ๋…ธ๋“œ๋กœ ์„ค์ •ํ•˜๊ณ  tail์ด ์ƒˆ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์—…๋ฐ์ดํŠธ
    if (!this.head) {
      this.head = newNode;
      this.tail = newNode;
    } else {
      this.tail.next = newNode;
      this.tail = newNode;
    }

    this.size++;
  }

  dequeue() {
    // ํ๊ฐ€ ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ null ๋ฐ˜ํ™˜
    // ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด head๋ฅผ ํ์˜ ๋‘ ๋ฒˆ์งธ ์š”์†Œ๋กœ ์„ค์ •ํ•˜๊ณ  ์ œ๊ฑฐ๋œ ๋…ธ๋“œ์˜ data๋ฅผ ๋ฐ˜ํ™˜
    if (!this.head) {
      return null;
    }

    const removeNode = this.head;
    this.head = this.head.next;
    if (!this.head) {
      this.tail = null;
    }

    this.size--;

    return removeNode.data;
  }
  // ํ๊ฐ€ ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ true ๋ฐ˜ํ™˜, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false ๋ฐ˜ํ™˜ 
  isEmpty() {
    return this.size === 0;
  }
}

const Q = new Queue();
Q.enqueue(1);
Q.enqueue(2);
Q.dequeue();
console.log(Q);

 

๐Ÿง‘๐Ÿป‍๐Ÿ’ป ๋Œ€๋‹จํ•œ ์‹ค๋ ฅ์ž๊ฐ€ ์•„๋‹Œ ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ์ทจ์ค€์ƒ์ž…๋‹ˆ๋‹ค. ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๊ณผ๊ฐํ•˜๊ฒŒ ๋Œ“๊ธ€๋กœ ํ˜ผ์ญ๋‚ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹คโ—๏ธ