알고리즘

[BOJ]28279 - 덱2(JS)

로돌씨 2024. 8. 13. 16:51

덱 구조를 활용하는 문제이다. 

처음 풀이

let fs = require("fs");
let input = fs.readFileSync('예제.txt').toString().trim().split("\n");
let N = Number(input[0])
input.shift();
let ans = [];
for(let x of input){
    if(x[0] == 1){
        let [a,b] = x.split(" ");
        ans.unshift(Number(b))
    }
    if(x[0] == 2){
        let [a,b] = x.split(" ");
        ans.push(Number(b))
    }
    if(x[0] == 3){
        if(ans.length !== 0){
            console.log(ans.shift())
            
        }else{
            console.log(-1)
        }
    }
    if(x[0] == 4){
        if(ans.length !== 0){
            console.log(ans.pop())
        }else{
            console.log(-1)
        }
    }
    if(x[0] == 5){
        console.log(ans.length)
    }
    if(x[0] == 6 ){
        if(ans.length !== 0){
            console.log(0)
        }else{
            console.log(1)
        }
    }
    if(x[0] == 7){
        if(ans.length !== 0){
            console.log(ans[0])
        }else{
            console.log(-1)
        }
    }
    if(x[0] == 8){
        if(ans.length !== 0){
            console.log(ans[ans.length-1])
        }else{
            console.log(-1)
        }
    }
}

 

처음엔 shift 와 unshift를 이용해서 넣었는데 시간초과로 인해 실패했다 연산이 오래걸리는듯 하다.

 

https://arnopark.tistory.com/838

 

[백준/nodeJS] 28279. 덱 2

안녕하세요. 박기린 입니다. 백준 28279번 덱 2 문제를 풀어보겠습니다. 문제 링크 https://www.acmicpc.net/problem/28279 28279번: 덱 2 첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000) 둘째 줄부터 N개

arnopark.tistory.com

이 분의 풀이를 참고했다 스택 , 큐 , 덱등의 개념을 일절 몰랐던 나는 너무 도움이 되었다.

 

우선 이란?

덱은 양쪽 끝에서 삽입과 삭제가 모두 가능한 자료 구조의 한 형태이다. 두 개의 포인터를 사용하여, 양쪽에서 삭제와 삽입을 발생시킬 수 있다. 큐와 스택을 합친 형태로 생각할 수 있다.

 

스택과 큐를 합친 구조이다. 왜 이것을 사용해야 하는가? 

shift 의 시간 복잡도는 O(N) 이다. 덱을 사용하면 O(1) 을 유지한 채로 풀이가 가능하다.

const fs = require("fs");
const [N, ...input] = fs
  .readFileSync("/dev/stdin")
  .toString()
  .trim()
  .split("\n");
const n = 1000000;
let output = "";

const deque = new Array(n);
let size = 0;
let front = -1;
let rear = -1;

const addFirst = (e) => {
  if (size === 0) {
    front = 0;
    rear = 0;
  } else {
    if (front === 0) {
      front = n - 1;
    } else {
      front--;
    }
  }

  deque[front] = e;
  size++;
};

const addLast = (e) => {
  if (size === 0) {
    front = 0;
    rear = 0;
  } else {
    if (rear === n - 1) {
      rear = 0;
    } else {
      rear++;
    }
  }

  deque[rear] = e;
  size++;
};

const removeFirst = () => {
  output += deque[front] + "\n";
  size--;
  if (front === n - 1) {
    front = 0;
  } else {
    front++;
  }
};

const removeLast = () => {
  output += deque[rear] + "\n";
  size--;

  if (rear === 0) {
    rear = n - 1;
  } else {
    rear--;
  }
};

input.forEach((e) => {
  const [exe, num] = e.split(" ").map(Number);

  if (exe === 1) {
    addFirst(num);
  }

  if (exe === 2) {
    addLast(num);
  }

  if (exe === 3) {
    size === 0 ? (output += "-1\n") : removeFirst();
  }

  if (exe === 4) {
    size === 0 ? (output += "-1\n") : removeLast();
  }

  if (exe === 5) {
    output += size + "\n";
  }

  if (exe === 6) {
    size === 0 ? (output += "1\n") : (output += "0\n");
  }

  if (exe === 7) {
    size === 0 ? (output += "-1\n") : (output += deque[front] + "\n");
  }

  if (exe === 8) {
    size === 0 ? (output += "-1\n") : (output += deque[rear] + "\n");
  }
});

console.log(output);

 

 

'알고리즘' 카테고리의 다른 글

[BOJ] 11050 - 이항계수1(JS)  (0) 2024.09.19
[BOJ]4949 - 균형잡힌 세상(JS)  (0) 2024.08.13
[BOJ]28278 - 스택2(JS)  (0) 2024.07.30
[BOJ]4948 - 베르트랑 공준(JS)  (0) 2024.07.25
[BOJ]4134 - 다음소수 (JS)  (1) 2024.07.23