정수로 이루어진 배열 numbers가 있습니다. 배열 의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수라고 합니다.
정수 배열 numbers가 매개변수로 주어질 때, 모든 원소에 대한 뒷 큰수들을 차례로 담은 배열을 return 하도록 solution 함수를 완성해주세요. 단, 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다.
numbers : [2, 3, 3, 5]
[3, 5, 5, -1]
4 ≤ numbers의 길이 ≤ 1,000,000
1 ≤ numbers[i] ≤ 1,000,000
function solution(numbers) {
var answer = Array.from({length: numbers.length},()=>-1);
let stack = [];
for(let i=numbers.length-1; i>=0; i--) {
while(stack.length>0 && stack[stack.length-1]<=numbers[i]) stack.pop();
if(stack.length>0) answer[i] = stack[stack.length-1];
stack.push(numbers[i]);
}
return answer;
}
역순을 생각하지 못해서 조금 삽질했다. filter를 이용해 구현을 했는데 오히려 이중 for문보다 효율이 낮아서 이중 for문으로도 구현했지만, 조금 더 좋아졌을 뿐 완벽하지는 못해서 무한 while을 이용해서 구현했다.. 하지만 가장 큰 문제인 10 1 10 10 11일 경우 1보다 큰 가장 가까운 수를 10으로 판단하게 하는 과정에서 막혔다. stack으로 풀면 된다는 것까지 왔는데 역순으로 구현하려니 stack에 저장되는거랑 내 머릿속에서 동작하는게 불일치돼서 조금 고생했다.. 오늘은 잘 안 풀리는 날인가보다..ㅜ