🧠𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺/💛 백준
[백준/알고리즘기초1] 자료구조1. 10828번 스택(JavaScript)
안오늘
2021. 10. 10. 10:42
문제
https://www.acmicpc.net/problem/10828
10828번: 스택
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지
www.acmicpc.net
첫번째 풀이 : 시간초과

코드는 아래와 같았다.
철저히 .. 문제를 코드로 구현한 .. 수준..ㅋ
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split('\n');
const N = parseInt(input.shift(), 10);
let stack = [];
for (let i = 0; i < N; i++) {
let command = input[i].split(' ');
if (command[0] === 'push') {
stack.push(Number(command[1]));
}
else if (command[0] === 'top') {
if (stack.length === 0) {
console.log(-1);
}
else {
console.log(stack[stack.length - 1]);
}
}
else if (command[0] === 'size') {
console.log(stack.length);
}
else if (command[0] === 'empty') {
if (stack.length === 0) {
console.log(1);
}
else {
console.log(0);
}
}
else if (command[0] === 'pop') {
if (stack.length === 0) {
console.log(-1);
}
else {
const number = stack.pop();
console.log(number);
}
}
}
두번째 풀이 : 성공

출력을 각각 명령어일때마다 하면 시간초과가 생기는 것 같다.
한 곳에 출력할 것들을 담아놓은다음, \n을 이용해서 출력해야 성공한다.
코드는 아래와 같았다.
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split('\n');
const N = parseInt(input.shift(), 10);
let stack = [];
let answer = [];
for (let i = 0; i < N; i++) {
switch (input[i]) {
case 'pop':
answer.push(stack.pop() || -1);
break;
case 'top':
answer.push(stack[stack.length - 1] || -1);
break;
case 'size':
answer.push(stack.length);
break;
case 'empty':
answer.push(stack[0] ? 0 : 1);
break;
default:
stack.push(Number(input[i].split(' ')[1]));
break;
}
}
console.log(answer.join('\n'));
우선 if else if 로 난잡한 코드를 switch, case로 깔끔하게 정리했다.
그리고 push의 경우에만 split하면 되므로 가장 마지막 default에서 작업한다!
정말 깔끔해졌다!