정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
push X: 정수 X를 스택에 넣는 연산이다.
pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size: 스택에 들어있는 정수의 개수를 출력한다.
empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
// 내 코드
let input = require('fs').readFileSync('dev/stdin').toString().split('\n');
const stack = []
for (let i=1; , i <= input[0]; i++){
const x= input[i].split(' ');
if (x.length >1 ){
stack.push(x[1])
}else {
switch (input[i]){
case 'pop':
stack.length=0 ? console.log(-1): console.log(stack.pop())
case 'top':
stack.length=0 ? console.log(-1): console.log(stack[stack.length-1])
case 'size':
console.log(stack)
case 'empty':
stack.length=0 ? console.log(1): console.log(0)
}
}
}
위에 처럼 작성을 했지만 통과하지 않음
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'));
출처 : https://gurtn.tistory.com/67
우선 array.shift
로 스택에서 제일 아래 자료를 가져와서 for loop range를 설정해준다.
그리고 switch 문을 적용을 해주는데 핵심은 세가지다
result.push(stack.pop() || -1)
로 stack.pop()이 가능하지 않을 때(Falsy
) -1을 결과에 추가하는 방식이다.시간초과
이슈로 result 한 배열
에 답을 넣어주고 한번에 출력
을 해준다.
// 내 답변
const input = require('fs').readFileSync('/dev/stdin').toString().split('\n');
const len = input[0];
const answer = []
for (let i = 1; i <= len ; i++){
const text = input[i].split(' ')
let reverse = text.map((word)=>{
let x = word.split('')
x.reverse()
return x.join('')
})
const result = reverse.join(' ')
answer.push(result)
}
console.log(answer.join('\n'))
배열을 다시 합칠 때는 arr.join()
이 활용도가 높다.
js 배열 뒤집는 메서드는 arr.reverse()
원본 유지하며 배열을 뒤집고자 할 때는 const reverseArr = [...arr].reverse()
구조분해할당 이용
// 내 답변
const input = require('fs').readFileSync('/dev/stdin').toString().split('\n');
const range = input[0]
const answer = []
for (let i = 1; i <= range ; i++){
let left = 0
let right =0
const text = input[i].split('')
for (let x of text){
if (x === `(`){
left += 1
}else {
right +=1
}
}
let result = ''
left === right ? result ='YES': result='NO'
answer.push(result)
}
console.log(answer.join('\n'))
잘 짠 것 같은데 틀렸다고 나온다.... 자세히 보니 만약 입력을 ())(()
을 입력하면 내 코드로는 맞다고 나오지만 예제출력에서는 NO
로 나왔다.
VPS의 정의를 제대로 이해하지 않고 시작해서 발생한 문제이다.
//참고 답변
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const len = input.shift();
const result = [];
for (let i = 0; i < len; i++) {
let cnt = 0;
for (let s of input[i]) {
cnt += s === "(" ? 1 : -1;
if (cnt < 0) break;
}
result.push(cnt === 0 ? 'YES' : "NO");
}
console.log(result.join('\n'));
참고 : https://gurtn.tistory.com/68
괄호가 열린다음 닫혀야 하는데 열리지 않고 닫힌 순간
에 cnt
가 음수
가 되어서 해당 문자열은 VPS가 아니게 된다
.