정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
push X: 정수 X를 스택에 넣는 연산이다.
pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size: 스택에 들어있는 정수의 개수를 출력한다.
empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
스택(stack)이란 쌓아놓은 더미를 뜻하며 자료구조의 한 종류로 후입선출(Last in First out, LIFO)방식을 사용하는 자료구조이다.
var fs = require('fs');
const [N, ...array] = fs.readFileSync('/dev/stdin').toString().split('\n');
function solution(N, array) {
let stack = [];
for (let i = 0; i < N; i++) {
const [order, number] = array[i].split(' ');
switch (order) {
case 'push':
stack.push(number);
break;
case 'pop':
console.log(stack.pop() || -1);
break;
case 'size':
console.log(stack.length);
break;
case 'empty':
console.log(stack.length > 0 ? 0 : 1);
break;
case 'top':
console.log(stack[stack.length - 1] || -1);
break;
}
}
}
solution(N, array);
시간 초과...;
왜 시간초과가 나왔는지 문제로 검색한 결과 console.log가 시간을 잡아먹는걸 알게 되었다...
그리고 for문안에 switch/case문이 아니라, 객체를 만들어야 키값을 이용해 맞는 연산 하나만 실행되는것도 알게 되었다...(switch/case를 할경우 위에서 아래로 맞는 case를 찾게 되므로)
var fs = require('fs');
const [N, ...array] = fs.readFileSync('/dev/stdin').toString().split('\n');
function solution(N, array) {
let stack = [];
let answer = [];
const orders = {
push: (number) => {
stack.push(number);
},
pop: () => {
const pop = stack.pop();
pop ? answer.push(pop) : answer.push(-1);
},
size: () => {
answer.push(stack.length);
},
empty: () => {
stack.length > 0 ? answer.push(0) : answer.push(1);
},
top: () => {
const top = stack[stack.length - 1];
top ? answer.push(top) : answer.push(-1);
},
};
for (let i = 0; i < N; i++) {
const [order, number] = array[i].split(' ');
orders[order](number);
}
console.log(answer.join(`\n`));
}
solution(N, array);
성공 🎉
메모리 12508KB
시간 208ms