코딩연습

[백준 알고리즘] Node.js 10866. 덱

니 뽀 2023. 7. 21. 11:51

1. 문제

https://www.acmicpc.net/problem/10866

 

10866번: 덱

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

2. 풀이

- Class 형태로 Deque를 만들어서 해결하였다.

const inputs = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const N = +inputs.shift();

class Deque {
  constructor(arr){
    this.array = arr;
  }
  push_front(value){
    let length = this.size();
    if(!length) this.array.push(value);
    else {
      let tempArr = [value, ...this.array];
      this.array = tempArr;
    }
  }
  push_back(value){
    this.array.push(value);
  }
  pop_front(){
    let length = this.size();
    if(!length) return -1
    
    return this.array.shift();
  }
  pop_back(){
    let length = this.size();
    if(!length) return -1;

    return this.array.pop();
  }
  size(){
    return this.array.length;
  }
  empty(){
    let length = this.size();
    if(!length) return 1;
    return 0;
  }
  front(){
    let length = this.size();
    if(!length) return -1

    return this.array[0];
  }
  back(){
    let length = this.size();
    if(!length) return -1

    return this.array[length-1];
  }
}

const deque = new Deque([]);
let result = "";

for(let i = 0; i < N; i++){
  const [text, num] = inputs[i].split(' ');
  switch(text){
    case "push_front":
      deque.push_front(+num);
      break;
    case "push_back":
      deque.push_back(+num);
      break;
    case "pop_front":
      result += `${deque.pop_front()}\n`;
      break;
    case "pop_back":
      result += `${deque.pop_back()}\n`;
      break;
    case "size":
      result += `${deque.size()}\n`;
      break;
    case "empty":
      result += `${deque.empty()}\n`;
      break;
    case "front":
      result += `${deque.front()}\n`;
      break;
    case "back":
      result += `${deque.back()}\n`;
      break;
  }
}

console.log(result);

 

3. 정리

1) 덱(Deque)이란?

  • 큐(Queue)와 스택(Stack)의 특징을 모두 가지고 있는 자료구조.
  • 큐처럼 선입선출(FIFO) 방식으로 동작할 수도 있고, 스택처럼 후입선출(LIFO) 방식으로 동작할 수 있다.
  • 큐와 스택의 특징을 모두 가져서 양쪽에서 데이터를 삽입하거나 삭제할 수 있다!!