단조 스택 계산기
수열의 각 원소마다 다음 큰 원소·이전 큰 원소를 O(n)에 찾고, 같은 뼈대로 히스토그램의 최대 직사각형 넓이를 냅니다. 스택이 단계마다 어떻게 밀려나는지 표로 따라갈 수 있습니다.
공백이나 쉼표로 구분합니다. 40개까지 봅니다.
스택에 들고 난 횟수
push 7회 · pop 6회
원소 7개를 한 번씩만 넣고 빼서 13번으로 끝냈습니다. 곧이곧대로 오른쪽을 훑으면 최악에 21번 견줍니다.
원소마다의 답
| i | 값 | 이전 큰 원소 | 다음 큰 원소 | 사이 거리 |
|---|---|---|---|---|
| 0 | 2 | 없음 | 4 (i=3) | 3 |
| 1 | 1 | 2 (i=0) | 2 (i=2) | 1 |
| 2 | 2 | 없음 | 4 (i=3) | 1 |
| 3 | 4 | 없음 | 5 (i=6) | 3 |
| 4 | 3 | 4 (i=3) | 5 (i=6) | 2 |
| 5 | 1 | 3 (i=4) | 5 (i=6) | 1 |
| 6 | 5 | 없음 | 없음 | — |
「없음」은 오른쪽 끝까지 자기보다 큰 값이 나오지 않았다는 뜻입니다. 수열의 최댓값은 반드시 「없음」입니다.
스택이 어떻게 움직이는지
| 단계 | 들어온 값 | 밀려난 것 | 스택 (바닥→꼭대기) |
|---|---|---|---|
| i=0 | 2 | — | 2 |
| i=1 | 1 | — | 2 1 |
| i=2 | 2 | 1 | 2 2 |
| i=3 | 4 | 2, 2 | 4 |
| i=4 | 3 | — | 4 3 |
| i=5 | 1 | — | 4 3 1 |
| i=6 | 5 | 1, 3, 4 | 5 |
스택 열을 세로로 훑어보면 언제나 왼쪽이 크고 오른쪽이 작습니다. 새 값보다 작은 것을 먼저 다 꺼내고 얹기 때문입니다. 밀려나는 순간이 곧 그 원소의 답이 정해지는 순간입니다.
사용 방법
- 1수열을 공백이나 쉼표로 구분해 넣습니다.
- 2「다음 큰 원소」에서 원소마다의 답과, 스택이 단계마다 어떻게 바뀌는지 봅니다.
- 3같은 값을 어떻게 볼지(> 와 ≥)를 바꿔 보면 답이 달라지는 것을 확인할 수 있습니다.
- 4「최대 직사각형」으로 바꾸면 같은 스택으로 히스토그램의 가장 넓은 직사각형을 찾습니다.
- 5후보 표에서 막대 하나마다 후보가 정확히 하나씩 나오는 것과, push·pop 횟수가 원소 수를 넘지 않는 것을 봅니다.
자주 묻는 질문
스택 안의 값이 항상 오름차순이거나 내림차순이 되도록 유지하는 스택입니다. 새 값을 넣기 전에 그 값에 밀리는 것을 전부 꺼내면 남은 것은 모두 새 값보다 크므로, 얹어도 순서가 깨지지 않습니다. 「다음 큰 원소」처럼 각 원소의 좌우에서 처음 만나는 더 큰(또는 더 작은) 값을 찾는 문제를 O(n)에 풀 때 씁니다.
원소 하나가 스택에 들어가는 것도 한 번, 나오는 것도 한 번뿐이기 때문입니다. 안쪽 while이 몇 바퀴를 돌든 그 바퀴 수의 총합은 pop 횟수와 같고 pop은 push를 넘을 수 없으므로, 전체 연산이 2n번 이하입니다. 한 번의 while이 오래 도는 것은 그 앞에서 그만큼 조용히 지나간 값이 있었다는 뜻입니다.
「더 큰(>)」으로 볼지 「크거나 같은(≥)」으로 볼지에 따라 답이 달라집니다. [3, 3, 3]에서 >로 보면 세 원소 모두 답이 없고, ≥로 보면 앞의 둘은 바로 다음 칸이 답입니다. 이 도구는 둘을 모두 지원하니 문제에서 요구하는 쪽을 골라 쓰면 됩니다.
같은 값이 섞이면 얻을 수 없습니다. 다음 큰 원소를 >로 구하려면 자기보다 작은 것만 꺼내야 하는데, 그러면 남은 꼭대기는 「크거나 같은」 것이지 「큰」 것이 아닙니다. 부등호를 한쪽에 맞추면 반대쪽이 어긋나므로 부등호를 뒤집은 스택으로 한 번 더 훑습니다. 두 번 훑어도 여전히 O(n)입니다.
막대 i를 높이로 삼는 가장 넓은 직사각형이 좌우로 i보다 낮은 막대를 만나기 직전까지 뻗기 때문입니다. 곧 「이전 더 작은 원소」와 「다음 더 작은 원소」를 찾는 문제라, 부등호만 뒤집은 같은 코드로 풀립니다. 막대마다 후보가 하나씩 나오고 그중 가장 넓은 것이 답입니다.
반복이 끝난 뒤 스택에 남은 막대를 따로 처리하지 않기 위해서입니다. 오른쪽 끝에 높이 −1짜리 가상 막대를 하나 세우면 남아 있던 것이 전부 밀려나 예외 처리가 사라집니다. 이 보초를 빼먹고 마지막에 따로 처리하려다 폭 계산을 틀리는 것이 이 문제에서 가장 흔한 실수입니다.
주가의 「며칠 만에 신고가를 넘었는가」, 온도의 「며칠 뒤에 더 따뜻해지는가」 같은 문제가 그대로 다음 큰 원소입니다. 히스토그램 최대 직사각형은 이진 행렬에서 가장 큰 직사각형을 찾는 문제의 부분 문제로도 쓰이고, 슬라이딩 윈도 최댓값(단조 덱)도 같은 발상의 변형입니다.
전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.
알아두면 좋은 점
- 단계별 표를 보이기 위해 40개까지만 처리합니다. 알고리즘 자체는 개수 제한이 없습니다.
- 최대 직사각형에서 음수 높이는 0으로 봅니다. 넓이가 뜻을 가지려면 높이가 0 이상이라야 합니다.
- 넓이가 같은 직사각형이 여럿이면 먼저 확정된 것 하나만 보여 줍니다.
- 전수 탐색 비교 횟수는 최악의 경우(오름차순 입력)를 적은 것으로, 실제로는 그보다 적을 수 있습니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.