Skip to content

문제 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가격이후 관찰기간
012·3·2·3 모두 ≥ 1, 끝까지 안 떨어짐4
123·2·3 모두 ≥ 2, 끝까지 안 떨어짐3
23다음 값 2 < 3 → 즉시 하락1
32다음 값 3 ≥ 2, 끝까지 안 떨어짐1
43이후 시점 없음0

단조 스택으로 O(n)

이중 반복이면 O(n²)입니다. 단조 스택monotonic stack을 쓰면 O(n)에 풉니다. 스택에는 "아직 하락 시점을 못 만난 시점의 인덱스"를 담아 둡니다.

  • 현재 시점 i를 보면서, 스택 맨 위 시점의 가격이 prices[i]보다 크면(하락 발생) 그 시점을 꺼내고 기간을 i - j로 확정합니다.
  • 더 이상 하락이 없으면 i를 스택에 넣습니다.
  • 반복이 끝난 뒤 스택에 남은 시점 j는 끝까지 하락이 없었으므로 기간은 n-1 - j입니다.

가격이 같을 때()는 "떨어지지 않은" 것으로 보아 꺼내지 않는 것이 핵심입니다.

answer=[4, 3, 1, 1, 0]

👉 실습(C++)에서 단조 스택으로 확인하기

PDF