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;
}
입력값의 제한은 다음과 같다.
이중 for문의 사용은 불가하다.
시간복잡도가 O(n)인 알고리즘을 사용해야 된다고 생각했다.
자료구조 스택이 떠올랐다.
for문을 돌리면서 배열 numbers의 각 인덱스를 의미하는 i를 스택에 넣는다.
이전 인덱스까지도 따져주기 위해 while문을 돌렸다.