문제 3 · 주식가격 · 단조 스택
문제 3 [3점]
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 각 시점에서 가격이 떨어지지 않은 기간(초) 을 반환하는 함수를 작성하세요.
prices: [1, 2, 3, 2, 3]
return: [4, 3, 1, 1, 0]풀이 및 해설
각 시점 i에 대해, 그 이후 시점을 하나씩 보다가 처음으로 가격이 prices[i]보다 낮아지는 순간까지의 초 수를 셉니다(떨어지는 그 순간도 1초로 포함). 끝까지 떨어지지 않으면 남은 시점 수를 셉니다.
예시 [1, 2, 3, 2, 3]을 손으로 확인하면
| i | 가격 | 이후 관찰 | 기간 |
|---|---|---|---|
| 0 | 1 | 2·3·2·3 모두 ≥ 1, 끝까지 안 떨어짐 | 4 |
| 1 | 2 | 3·2·3 모두 ≥ 2, 끝까지 안 떨어짐 | 3 |
| 2 | 3 | 다음 값 2 < 3 → 즉시 하락 | 1 |
| 3 | 2 | 다음 값 3 ≥ 2, 끝까지 안 떨어짐 | 1 |
| 4 | 3 | 이후 시점 없음 | 0 |
단조 스택으로 O(n)
이중 반복이면 O(n²)입니다. 단조 스택monotonic stack을 쓰면 O(n)에 풉니다. 스택에는 "아직 하락 시점을 못 만난 시점의 인덱스"를 담아 둡니다.
- 현재 시점
i를 보면서, 스택 맨 위 시점의 가격이prices[i]보다 크면(하락 발생) 그 시점을 꺼내고 기간을i - j로 확정합니다. - 더 이상 하락이 없으면
i를 스택에 넣습니다. - 반복이 끝난 뒤 스택에 남은 시점
j는 끝까지 하락이 없었으므로 기간은n-1 - j입니다.
가격이 같을 때(≥)는 "떨어지지 않은" 것으로 보아 꺼내지 않는 것이 핵심입니다.