출처
백준 온라인 저지
https://www.acmicpc.net/problem/10828
문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
- push X: 정수 X를 스택에 넣는 연산이다.
- pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 스택에 들어있는 정수의 개수를 출력한다.
- empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
- top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
풀이
풀이를 할 때마다 시간 초과가 채점 결과로 나와 풀지 못했던 문제였습니다.
각 명령을 수행할 때마다 출력을 시켜주는 코드에서는 시간 초과가 항상 채점 결과로 나왔습니다.
결국 몇 번의 시도 끝에 명령을 수행할 때마다 출력을 시켜주면 안 된다는 것을 깨달았습니다.
switch 문으로 각 조건을 구분해주고, 각 명령의 결과를 한 배열에 계속하여 푸시시켜주고 모든 명령을 수행한 후에 한 번에 출력시켜줍니다.
코드
const array = require('fs').readFileSync('/dev/stdin').toString().split('\n');
const stack = [];
const result = [];
const len = array.shift();
for (let i = 0; i < len; i++) {
switch(array[i]) {
case 'pop':
result.push(stack.pop() || -1);
break;
case 'size':
result.push(stack.length);
break;
case 'empty':
result.push(stack[0] ? 0 : 1);
break;
case 'top':
result.push(stack[stack.length - 1] || -1);
break;
default:
stack.push(array[i].split(" ")[1]);
break;
}
}
console.log(result.join('\n'));
다른 방식
객체 메서드와 reduce 메서드를 활용해 보았습니다. fun이란 객체에 각 명령을 딴 메서드에는 해당 명령의 요구 결과를 반환시켜줍니다.
단 push 명령은 "push 2"와 같은 형식이기에 예외처리를 해주었습니다.
const array = require('fs').readFileSync('/dev/stdin').toString().split('\n');
array.shift();
const stack = [];
const fun = {
pop: () => stack.pop() || -1,
size: () => stack.length,
empty: () => stack[0] ? 0 : 1,
top: () => stack[stack.length - 1] || -1,
push: (item) => {
stack.push(item.split(" ")[1]);
return '';
}
}
const result = array.reduce((acc, v) =>
acc + (fun[v] ? `${fun[v]()}\n` : fun.push(v)), '');
console.log(result);