백준 10828 스택 | Javascript로 스택 구현하기

예짱구·2025년 8월 28일

알고리즘

목록 보기
13/16

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


자바스크립트 기본 내장 함수인 push, pop을 사용하지 않고 구현해야하는 문제이다.
어려워보이지만 차근차근 풀어나가면 꽤나 간단한 문제임 !!

시간 초과🤯

테스트케이스를 모두 통과해서 제출한 코드가 제출한지 1초만에 시간초과로 오답처리 되었다 ..

혼자서 한참 고민해봤는데 어떤 부분을 최적화해야할지 감이 오지 않아 GPT에게 힌트를 요청했고, 이를 통해 수정한 내용은 아래와 같다.

  • pushX 함수에서 값을 추가할 때 스프레드 연산자를 사용하는 대신, 배열의 마지막 위치의 값만 새로 할당하도록 수정했다.

  • 출력하는 부분 역시 각 함수에서 매번 출력하는 것이 아니라, 값을 저장했다가 입력값에 대해 모두 실행이 된 후에 저장한 값을 출력하도록 했다. 이 부분을 수정하면서 pushX함수의 매개변수에 값을 저장할 배열도 추가했다.


push X: 정수 X를 스택에 넣는 연산이다.

function pushX(arr, x) {
  arr[arr.length] = x;
}

pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

function pop() {
  if (stack.length === 0) {
    pushX(answer, -1);
    return;
  }
  pushX(answer, stack[stack.length - 1]);
  stack.splice(stack.length - 1, 1);
}

size: 스택에 들어있는 정수의 개수를 출력한다.

function size() {
  pushX(answer, stack.length);
}

empty: 스택이 비어있으면 1, 아니면 0을 출력한다.

function empty() {
  pushX(answer, stack.length === 0 ? 1 : 0);
}

top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

function top() {
  pushX(answer, stack[stack.length - 1] || -1);
}

그리고 이 함수들을 입력값에 따라 실행하도록 하는 함수를 추가하면 된다 !!


전체 코드

let stack = [],
  answer = [];

function pushX(arr, x) {
  arr[arr.length] = x;
}

function pop() {
  if (stack.length === 0) {
    pushX(answer, -1);
    return;
  }

  pushX(answer, stack[stack.length - 1]);
  stack.splice(stack.length - 1, 1);
}

function size() {
  pushX(answer, stack.length);
}

function empty() {
  pushX(answer, stack.length === 0 ? 1 : 0);
}

function top() {
  pushX(answer, stack[stack.length - 1] || -1);
}

function solution(array) {
  for (let i in array) {
    if (array[i].startsWith("push")) {
      pushX(stack, array[i].split(" ")[1]);
    } else if (array[i] === "pop") {
      pop();
    } else if (array[i] === "size") {
      size();
    } else if (array[i] === "empty") {
      empty();
    } else if (array[i] === "top") {
      top();
    }
  }
}

// =====입출력=====

const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = [];

rl.on("line", (line) => {
  input.push(line);

  if (input.length === parseInt(input[0]) + 1) {
    rl.close();
  }
}).on("close", () => {
  const count = parseInt(input[0]);
  const array = input.slice(1, count + 1);

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

profile
IF YOU WANNA CHANGE, BE NOT AFRAID💥

2개의 댓글

comment-user-thumbnail
2025년 8월 29일

멋져요👍

1개의 답글