문제 설명
초 단위로 기록된 주식 가격이 담긴 배열 prices가 주어질 때, 각 시점의 주식 가격이 얼마나 오래 동안 떨어지지 않았는지를 계산하여 배열로 반환하는 함수를 완성하시오.
제한 사항
- prices의 각 원소는 1 이상 10,000 이하의 자연수입니다.
- prices의 길이는 2 이상 100,000 이하입니다.
입출력 예
pricesreturn
| [1, 2, 3, 2, 3] | [4, 3, 1, 1, 0] |
입출력 예 설명
- 0초 시점의 가격 1은 끝까지 가격이 떨어지지 않음 → 4초 동안 유지됨
- 1초 시점의 가격 2도 끝까지 떨어지지 않음 → 3초 동안 유지됨
- 2초 시점의 가격 3은 3초 시점에 떨어짐 → 1초 동안 유지됨
- 3초 시점의 가격 2는 4초까지 유지됨 → 1초 동안 유지됨
- 4초 시점의 가격 3은 이후 비교 대상이 없음 → 0초 유지됨
핵심 요구사항 요약
- prices[i]는 i초 시점의 주식 가격
- 각 가격이 자신보다 더 낮은 가격을 처음 만날 때까지의 시간을 초 단위로 센다
- 만약 끝까지 떨어지지 않으면 남은 전체 시간(끝까지)을 센다
이 문제는 주식 가격이 떨어지지 않는 시간을 계산하는 것이 핵심이다.
배열 prices[i]는 i초 시점의 주식 가격을 의미한다.
- prices = [1, 2, 3, 2, 3]
- 시간 : 0 1 2 3 4
그러므로 각 시점에서 시작해서 언제까지 가격이 떨어지지 않는지를 측정해야 한다.
그렇다면 우리가 생각할 수 있는 거는 각 i번째 초에 대해, 그 시점 이후의 시간들 중에서 처음 가격이 떨어지는 시점까지의 시간을 세면 된다. 만약 끝까지 안 떨어지면 전체 남은 시간을 세면 된다.
또한 시간 복잡도도 생각해 봐야한다 입력에서 봤듯이 아래와 같은 조건이 있다.
- prices의 길이는 2 이상 100,000 이하입니다.
따라서 O(N^2)은 시간 초가가 되므로 스택을 이용하면 O(N) 수준으로 최적화할 수도 있다.
알고리즘 코드
import java.util.Stack;
class Solution {
public int[] solution(int[] prices) {
int[] answer = new int[prices.length];
Stack<Integer> stk = new Stack<>();
for (int i = 0; i < prices.length; i++) {
// 가격이 떨어지는 순간이 오면
while (!stack.isEmpty() && prices[i] < prices[stack.peek()]) {
int prevIndex = stack.pop();
answer[prevIndex] = i - prevIndex;
}
stack.push(i); // 현재 인덱스를 넣는다
}
// 아직 떨어지지 않은 애들 (끝까지 유지됨)
while (!stack.isEmpty()) {
int idx = stack.pop();
answer[idx] = prices.length - 1 - idx;
}
return answer;
}
}
시간 복잡도 분석
O(N)
'코딩 테스트 준비 > 문제' 카테고리의 다른 글
| 14. 프로그래머스 - 폰켓몬 (해시) (2) | 2025.07.29 |
|---|---|
| 13. 프로그래머스 - 더 맵게 (힙) (1) | 2025.07.28 |
| 11. 프로그래머스 - 오픈 채팅방(해시) (2) | 2025.07.21 |
| 10. 프로그래머스 - 할인 행사(해시) (1) | 2025.07.21 |
| 10. 프로그래머스 - 완주하지 못한 선수 (해시) (2) | 2025.07.12 |