PS/BOJ
[BOJ] 오큰수
returnzero
2022. 7. 2. 17:46
시간초과가 발생한다.
let input =require('fs').readFileSync('./input.txt').toString().trim().split('\n');
let nums= input[1].split(' ').map(e=>Number(e))
// console.log(nums);//[ 3, 5, 2, 7 ]
let ans=[];
ans[nums.length-1]=-1;
for(let i= nums.length-2;i>=0;i--){
if(nums[i]<nums[i+1]) ans[i]=nums[i+1];
else {
//nums[i] << ans[i+1]~ans[ans.length-1]
let check =1;
for(let k=i+1;k<ans.length;k++){
if(nums[i]<ans[k] ) {
ans[i]=ans[k];
check=0;
break;
}
}
if( check) ans[i]=-1
}
};
// console.log(ans);
let str="";
ans.forEach(e=>str+=(e+" "));
console.log(str);
2. 그래서 차곡차곡 스택이 쌓이는 모양을 생각해보아야하는 문제다.
그리고 가장큰게 나올때까지 pop을 계속해줘야하는 문제.. 문제 자체는 어렵지 않지만 이게 stack만 활용하면 풀린다는걸 아는게 어려울 것 같다.
let input =require('fs').readFileSync('./input.txt').toString().trim().split('\n');
let nums= input[1].split(' ').map(e=>Number(e))
// console.log(nums);//[ 3, 5, 2, 7 ]
let ans=[];
ans[nums.length-1]=-1;
let Stack=[]
Stack.push(nums[nums.length-1]);
for(let i= nums.length-2;i>=0;i--){
let last= Stack[Stack.length-1];
if( last> nums[i]){
ans[i]=last;
Stack.push(nums[i]);
}
else{
while( last<=nums[i]&&(Stack.length!==0)){
Stack.pop();
last= Stack[Stack.length-1];
}
if(Stack.length===0) {ans[i]=-1;}
else{
ans[i]=last;}
Stack.push(nums[i]);
}
};
// console.log(ans);
let str="";
ans.forEach(e=>str+=(e+" "));
console.log(str);