지식의모듈화

[BOJ] 오큰수 본문

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);

'PS > BOJ' 카테고리의 다른 글

[BOJ] 좌표압축  (0) 2022.07.02
[BOJ] 통계학  (0) 2022.07.01