Development/자료구조 & 알고리즘
[알고리즘] 프로그래머스 - 뒤에 있는 큰 수 찾기 (JS)
heondeam
2023. 8. 28. 23:16
✅ 문제
정수로 이루어진 배열 numbers 가 있습니다. 배열 의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수라고 합니다.
정수 배열 numbers 가 매개변수로 주어질 때, 모든 원소에 대한 뒷 큰수들을 차례로 담은 배열을 return 하도록 solution 함수를 완성해주세요. 단, 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다.
✅ 풀이
이중반복문(O(N^2))을 이용한 풀이 → 테스트 20,21,22,23 시간 초과.
스택(O(N))을 이용해서 풀이해야 한다. numbers 배열을 역순으로 순회하면서 각 원소에 대해서 스택을 사용하여 뒷 큰수를 찾는다. (이 때, 각 원소는 한 번씩 스택에 푸시되고 팝되므로 모든 원소에 대해 스택 연산이 상수 시간에 이루어짐)
function solution(numbers) {
const length = numbers.length;
// 뒷 큰수가 모두 존재하지 않는 것으로 가정하고 정답 배열은 -1로 설정.
const answer = Array.from({length}, () => -1);
const stack = [];
// numbers 순회
for (let i = length - 1; i >= 0; i--) {
// 스택의 꼭대기 부터 계속 뒷큰수 찾아나감.
while (stack.length !== 0 && numbers[i] >= stack.at(-1)) {
stack.pop();
}
// 뒷큰수가 존재할 시
if (stack.length !== 0) {
answer[i] = stack.at(-1);
}
// 다음 숫자를 위해 현재 숫자를 스택에 푸시
stack.push(numbers[i]);
}
return answer;
}
- 배열 원소에 접근할 때 앞 쪽에서부터 접근할 것인지 뒤 쪽에서부터 접근할 것인지 한번 더 생각해보자.
- 이중반복문으로 시간초과가 날 때, 무조건 O(N)으로 끝낼 수 있는 알고리즘을 생각해내자.