본문 바로가기
코딩테스트(알고리즘)/baekjoon

[baekjoon] 10866 덱 (Javascript)

by Cafe Mocha 2022. 6. 30.

10866번: 덱 (acmicpc.net)

 

10866번: 덱

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

www.acmicpc.net


접근 : 덱, 구현

 

Javascript로 직접 덱을 함수형으로 구현

 

Javascript

let input = require("fs")
  .readFileSync("input.txt") //"/dev/stdin"
  .toString()
  .split("\n")
  .map((val) => val.trim());

const MX = 1000005;
class Deque {
  constructor() {
    this.arr = new Array(2 * MX + 1);
    this.head = MX;
    this.tail = MX;
  }
  push_front(data) {
    this.arr[--this.head] = data;
  }
  push_back(data) {
    this.arr[this.tail++] = data;
  }
  pop_front() {
    this.head++;
  }
  pop_back() {
    this.tail--;
  }
  front() {
    return this.arr[this.head];
  }
  back() {
    return this.arr[this.tail - 1];
  }
  size() {
    return this.tail - this.head;
  }
  empty() {
    if (this.head === this.tail) return true;
    else return false;
  }
}

let deque = new Deque();
let answer = [];
function solution() {
  let n = +input.shift();
  for (let i = 0; i < n; i++) {
    let cmd = input.shift().split(" ");

    switch (cmd[0]) {
      case "push_front":
        dequePush_front(+cmd[1]);
        break;
      case "push_back":
        dequePush_back(+cmd[1]);
        break;
      case "pop_front":
        dequePop_front();
        break;
      case "pop_back":
        dequePop_back();
        break;
      case "size":
        dequeSize();
        break;
      case "empty":
        dequeEmpty();
        break;
      case "front":
        dequeFront();
        break;
      default:
        dequeBack();
        break;
    }
  }

  console.log(answer.join("\n"));
}

function dequePush_front(num) {
  deque.push_front(num);
}

function dequePush_back(num) {
  deque.push_back(num);
}

function dequePop_front() {
  if (deque.empty()) answer.push(-1);
  else {
    let temp = deque.front();
    deque.pop_front();
    answer.push(temp);
  }
}
function dequePop_back() {
  if (deque.empty()) answer.push(-1);
  else {
    let temp = deque.back();
    deque.pop_back();
    answer.push(temp);
  }
}

function dequeSize() {
  answer.push(deque.size());
}

function dequeEmpty() {
  if (deque.empty()) answer.push(1);
  else answer.push(0);
}

function dequeFront() {
  if (deque.empty()) answer.push(-1);
  else answer.push(deque.front());
}

function dequeBack() {
  if (deque.empty()) answer.push(-1);
  else answer.push(deque.back());
}

solution();