프로그래머스 Lv.2 뒤에있는큰수찾기

Kim Jason·2023년 4월 4일
0

알고리즘 노트

목록 보기
29/35
post-thumbnail

💁🏻 코드

function solution(numbers) {
  let stack = [];
  let answer = new Array(numbers.length).fill(0);
  
  for (let i = 0; i < numbers.length; i++) {
    // ✅ 해당 인덱스 i에 대해 이전 인덱스에 해당하는 값들과 비교한다
    while (stack.length > 0 && numbers[stack.at(-1)] < numbers[i]) {
      answer[stack.pop()] = numbers[i];
    }
    // ✅ 스택에는 인덱스 정보가 담긴다
    stack.push(i);
  }
  
  // ✅ 스택에 인덱스가 남아있다면 해당 인덱스에 대한 값들을 모두 -1로 바꾼다
  while (stack.length > 0) {
    answer[stack.pop()] = -1;
  }
  
  return answer;
}

입력값의 제한은 다음과 같다.

  • 4 <= numbers 배열의 길이 <= 1,000,000

이중 for문의 사용은 불가하다.
시간복잡도가 O(n)인 알고리즘을 사용해야 된다고 생각했다.
자료구조 스택이 떠올랐다.
for문을 돌리면서 배열 numbers의 각 인덱스를 의미하는 i를 스택에 넣는다.
이전 인덱스까지도 따져주기 위해 while문을 돌렸다.

profile
성장지향형 프론트엔드 개발자

0개의 댓글