"단조 스택은 쓸모없어지는 순간 다시는 필요 없을 걸 버려. 그 무자비한 잊음이 O(n²) '앞 보기' 를 한 번의 O(n) 패스로 바꿔."
이게 푸는 문제
생각해봐: 배열의 각 원소에 대해, 오른쪽으로 다음에 나오는 더 큰 원소 ("next greater element") 를 찾아. 당연한 해법은, 각 원소마다 더 큰 게 나올 때까지 오른쪽으로 훑기 — O(n²). 많은 데이터엔 너무 느려. 단조 스택이 전체를 O(n) 에 풀고, 이 퀘스트 전체에서 가장 만족스러운 트릭 중 하나야.
아이디어: 스택을 정렬 상태로 유지
단조 스택은 원소를 정렬 순으로 유지해 — 가령, 바닥에서 위로 감소 — 새 걸 push 하기 전에 순서를 어기는 원소를 다 pop 해서. "next greater" 마법: 왼쪽에서 오른쪽으로 걸어. 각 새 값을 push 하기 전에, 스택 위 그것보다 작은 원소를 다 pop 해 — 그 pop 된 원소들 각각한테, 이 새 값이 그들의 next greater element 니까. 한 동작에 답하고 버린 거야. 스택에 남은 건 아직 답을 기다리는 거.
안쪽 pop-반복문이 있는데 왜 O(n²) 아니라 O(n) 이야? Complexity 트랙의 분할 상환 논증: 각 원소가 정확히 한 번 push 되고 많아야 한 번 pop 돼. 총 push + pop ≤ 2n. 안쪽 반복문의 총 일이 전체 구간에 걸쳐 선형이야, 어느 한 단계가 여러 원소를 pop 할 수 있어도. 중첩이 아니라 총 연산을 세면 O(n) 이 드러나.
문제의 가문
모양을 알아보면, 가문 전체가 열려: next greater / next smaller element, daily temperatures (더 따뜻한 날까지 며칠), stock span (이전 연속 며칠이 더 낮았나), 그리고 유명한 히스토그램 최대 직사각형. 다 신호 하나를 공유해: "각 원소마다, 어떤 방향으로 그걸 이기는 가장 가까운 원소 찾기." 그게 들리면, 단조 스택으로 가.