https://www.acmicpc.net/step/1874
let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n')
let n = input.shift()
let arr = Array.from({length:n},(v,i)=>n-i)
let s = [];
let answer = [];
while(input != 0){
if(s && s[s.length-1]===input[0]){
input.shift();
s.pop()
answer.push('-');
}else{
if(input.length !== 0 &&arr.length === 0) {
answer.push('NO')
break;
}
s.push(arr.pop());
answer.push('+')
}
}
console.log(answer[answer.length-1] ==='NO' ? 'NO':answer.join('\n'))
[1~N]
까지의 배열을 만들어서 while안에서 받아온 배열을 하나씩 뺴주면서 만든 배열과 비교를 했더니 메모리 초과가 나왔다.. 아마 N이 엄청 커졌을때 둘을 비교하는데 엄청 큰 수가 들어가서 그런거 같아서
배열을 만들지 않고 i를 직접 만들어서 문제를 풀어보았다.
let input2 = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n')
let n = input2.shift()
let input = input2.map(Number) //1
let s = [];
let answer = [];
let i = 1;
for(let j = 0; j<input.length; j++){ //2
while(s.length === 0 || s[s.length-1]<input[j]){
s.push(i)
i++
answer.push("+")
}
if(s[s.length-1] === input[j]){ //3
s.pop()
answer.push("-")
}else{
answer.push("NO")
break;
}
}
console.log(answer[answer.length-1] ==='NO' ? 'NO':answer.join('\n')) //4
- 받아온 배열을
Number
형으로 새로운 배열에 저장한다.for
문으로 받아온 배열을 순회하면서 만약stack
에 가장 마지막으로 들어간 수가input
의j
번째 수보다 작으면stack
계속 넣어준다.- 만약에
stack
에 가장 마지막 수가input
의j
번째수와 같다면stack
에서pop()
해주고
같지 않다면stack
으로 만들 수 없는 배열이므로answer
에NO
를 넣어준다answer
배열에NO
가 있으면stack
으로 될 수 없는 배열이므로NO
를 리턴하고 아니면+,-
를 리턴
🌟 시간복잡도에 대해서 한번 더 생각하게 되는 계기가 되었으며 여러개의 배열을 만들어서 반복하는거보다 메모리를 줄이기 위해서 i를 직접 선언해서 하는 방법에 대해서 공부하는 계기가 되었다.