[BOJ] 스택_10828 by JS

개구링·2022년 1월 12일
0
post-thumbnail

문제

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

명령은 총 다섯 가지이다.

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

입력

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

출력

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

풀이

오랜만에 stack을 구현해보고자 Stack 객체를 생성해서 주어진 명령을 Stack의 프로토타입 메서드로 추가해주었다.
그냥 switch문 안에서 바로 로직을 짜도 되지만 메서드를 먼저 선언해두고 입력값에 따라서 호출만 해주는 방식으로 풀었다.

+ 

  • 시간초과가 나서 찾아보니 반복문 안에서 매번 console.log를 찍어준게 원인이었다. result라는 출력용 변수를 하나 만들어서 최종적으로 console로 찍어주니 해결되었다.
  • 풀이 과정에서 시간&메모리를 줄여보고자 slice와 splice의 차이를 다시 찾아볼 수 있었다. 가장 큰 차이는 slice는 배열을 복사해와서 자른다는 것이고, splice는 기존 배열에서 잘라낸다는 것이다(기존 배열도 변경됨).
let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n');

function Stack() {
  this._stack = [];
  this.length = 0;
}

Stack.prototype.push = function(value) {
  this._stack[this.length++] = value;
}

Stack.prototype.pop = function() {
  if (!this.length) return -1;

  const value = this.top();
  this._stack.splice(this.length-- - 1, 1);

  return value;
}

Stack.prototype.top = function() {
  if (!this.length) return -1;

  return this._stack.slice(-1);
}

Stack.prototype.size = function() {
  return this.length;
}

Stack.prototype.empty = function() {
  return !this.length ? 1 : 0;
}

let result = '';
const stack = new Stack();
const commands = input.splice(1,);

for (c of commands) {
  switch (c.split(' ')[0]) {
    case 'push':
      stack.push(c.split(' ')[1]);
      break;
    case 'pop':
      result += (stack.pop() + '\n');
      break;
    case 'top':
      result += (stack.top() + '\n');
      break;
    case 'size': 
      result += (stack.size() + '\n');
      break;
    case 'empty':
      result += (stack.empty() + '\n');
      break;
  }
}

console.log(result);

profile
기록을 취미로

0개의 댓글