const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split('\n').map(Number)
const N = input[0]
const a = input.slice(1)
const solution = (N, a) => {
let stack = []
let result = ''
let j = 0
for(let i = 1; i <= N; i++){
stack.push(i)
result += '\n+'
while(stack[stack.length-1] === a[j]){
stack.pop()
result += '\n-'
j++
if(j === N) break;
}
}
return stack.length === 0 ? result.slice(1) : 'NO'
}
console.log(solution(N, a))
배열 stack에 1부터 N까지의 숫자를 차례로 push()할 때마다
stack의 마지막 값과 입력값 a의 값을 비교하여 같으면 pop() 한다.
비교하려는 a의 값이 마지막 값이면 stack[stack.length-1]
과 a[j]
가 둘다 undefined가 되어 while() 조건식이 true가 되므로 break조건을 추가했다.
최종적으로 stack의 길이가 0이면 목표하는 스택 수열을 만든 것이므로
result의 첫 문자\n
를 slice(1) 으로 처리하여 반환한다.
0이 아니면 스택 수열을 만들지 못한 것이므로 'NO'를 반환한다.
### N: 8
### a: [4,3,6,8,7,5,2,1]
### stack result
[ 1 ] // +
[ 1, 2 ] // + +
[ 1, 2, 3 ] // + + +
[ 1, 2, 3, 4 ] // + + + +
[ 1, 2, 3 ] // + + + + -
[ 1, 2 ] // + + + + - -
[ 1, 2, 5 ] // + + + + - - +
[ 1, 2, 5, 6 ] // + + + + - - +
[ 1, 2, 5 ] // + + + + - - + -
[ 1, 2, 5, 7 ] // + + + + - - + - +
[ 1, 2, 5, 7, 8 ] // + + + + - - + - + +
[ 1, 2, 5, 7 ] // + + + + - - + - + + -
[ 1, 2, 5 ] // + + + + - - + - + + - -
[ 1, 2 ] // + + + + - - + - + + - - -
[ 1 ] // + + + + - - + - + + - - - -
[] // + + + + - - + - + + - - - - -