코딩테스트 문제풀이/backjoon

[백준] Node.js / 10828 - 스택

sangchu 2023. 5. 24. 20:41
 

10828번: 스택

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

www.acmicpc.net

문제

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 다섯 가지이다.

  • push X: 정수 X를 스택에 넣는 연산이다.
  • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 스택에 들어있는 정수의 개수를 출력한다.
  • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
  • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

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

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

예제 입력 

14
push 1
push 2
top
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
top

예제 출력 

2
2
0
2
1
-1
0
1
-1
0
3

예제 입력 2

7
pop
top
push 123
top
pop
top
pop

예제 출력 2

-1
-1
123
123
-1
-1

 

 

나의 풀이

첫 풀이(시간 초과)

const input = require("fs")
  .readFileSync("/dev/stdin")
  .toString()
  .trim()
  .split("\n");

const N = Number(input[0]);
const stack = [];

for (let i = 1; i <= N; i++) {
  let instruction = input[i].trim().split(" ")[0];
  let num = Number(input[i].trim().split(" ")[1]);

  if (instruction === "push") {
    stack.push(num);
  } else if (instruction === "pop") {
    console.log(stack.pop() || -1);
  } else if (instruction === "size") {
    console.log(stack.length);
  } else if (instruction === "empty") {
    console.log(stack.length === 0 ? 1 : 0);
  } else if (instruction === "top") {
    console.log(stack[stack.length - 1] || -1);
  }
}

매번 콘솔에 출력시켜주면서 시간 초과가 발생한다.

 

두번째 풀이(올바른 풀이)

switch문으로 각 조건을 구분해주고, 모든 명령을 수행한 후에 한번에 출력시켜준다.

const input = require("fs")
  .readFileSync("/dev/stdin")
  .toString()
  .trim()
  .split("\n");

const N = Number(input[0]);
const stack = [];
const answer = [];

for (let i = 1; i <= N; i++) {
  let instruction = input[i].trim().split(" ")[0];
  let num = Number(input[i].trim().split(" ")[1]);
  switch (instruction) {
    case "push":
      stack.push(num);
      break;
    case "pop":
      answer.push(stack.pop() || -1);
      break;
    case "size":
      answer.push(stack.length);
      break;
    case "empty":
      answer.push(stack.length === 0 ? 1 : 0);
      break;
    case "top":
      answer.push(stack[stack.length - 1] || -1);
      break;
    default:
      break;
  }
}

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

 

참고한 사이트: https://gurtn.tistory.com/67