도구스개발

단조 스택 계산기

수열의 각 원소마다 다음 큰 원소·이전 큰 원소를 O(n)에 찾고, 같은 뼈대로 히스토그램의 최대 직사각형 넓이를 냅니다. 스택이 단계마다 어떻게 밀려나는지 표로 따라갈 수 있습니다.

공백이나 쉼표로 구분합니다. 40개까지 봅니다.

스택에 들고 난 횟수

push 7회 · pop 6회

원소 7개를 한 번씩만 넣고 빼서 13번으로 끝냈습니다. 곧이곧대로 오른쪽을 훑으면 최악에 21번 견줍니다.

원소마다의 답

i이전 큰 원소다음 큰 원소사이 거리
02없음4 (i=3)3
112 (i=0)2 (i=2)1
22없음4 (i=3)1
34없음5 (i=6)3
434 (i=3)5 (i=6)2
513 (i=4)5 (i=6)1
65없음없음

「없음」은 오른쪽 끝까지 자기보다 큰 값이 나오지 않았다는 뜻입니다. 수열의 최댓값은 반드시 「없음」입니다.

스택이 어떻게 움직이는지

단계들어온 값밀려난 것스택 (바닥→꼭대기)
i=022
i=112 1
i=2212 2
i=342, 24
i=434 3
i=514 3 1
i=651, 3, 45

스택 열을 세로로 훑어보면 언제나 왼쪽이 크고 오른쪽이 작습니다. 새 값보다 작은 것을 먼저 다 꺼내고 얹기 때문입니다. 밀려나는 순간이 곧 그 원소의 답이 정해지는 순간입니다.

이중 반복처럼 보이지만 O(n)입니다. 안쪽 while이 몇 바퀴를 돌든 그 바퀴 수의 총합은 pop 횟수와 같고, pop은 push를 넘을 수 없습니다. 원소 하나가 들어가는 것도 한 번, 나오는 것도 한 번뿐이라 전체가 2n번 이하입니다. 한 번의 while이 오래 도는 것은 그 앞에서 그만큼 조용히 지나간 값이 있었다는 뜻입니다.
스택이 내림차순인 것은 유지 규칙의 결과입니다. 새 값을 얹기 전에 그보다 작은 것을 전부 꺼내니, 남은 것은 전부 새 값보다 큽니다. 그래서 얹어도 내림차순이 깨지지 않습니다. 밀려나는 순간이 답이 정해지는 순간인 이유도 같습니다 — 그 사이에 있던 값들은 이미 더 작아서 먼저 밀려났으므로 후보가 될 수 없습니다.
이전 큰 원소는 같은 스택에서 공짜로 나오지 않습니다. 「다 꺼내고 남은 꼭대기가 이전 큰 원소」라는 설명이 흔한데 같은 값이 섞이면 틀립니다. 다음 큰 원소를 >로 구하려면 작은 것만 꺼내야 하고, 그러면 남은 꼭대기는 «크거나 같은» 것이지 «큰» 것이 아닙니다. 그래서 여기서는 부등호를 뒤집은 스택으로 한 번 더 훑습니다. 두 번 훑어도 여전히 O(n)입니다.
최대 직사각형도 부등호만 뒤집은 같은 코드입니다. 막대 i를 높이로 삼는 가장 넓은 직사각형은 좌우로 i보다 낮은 막대를 만나기 직전까지 뻗습니다. 곧 「이전 더 작은 원소」와 「다음 더 작은 원소」를 찾는 문제입니다. 오른쪽 끝에 높이 −1짜리 보초를 하나 세우면 남은 것이 전부 밀려나 예외 처리가 사라지는데, 이 보초를 빼먹고 반복이 끝난 뒤 따로 처리하려다 폭을 틀리는 것이 이 문제의 단골 실수입니다.

사용 방법

  1. 1수열을 공백이나 쉼표로 구분해 넣습니다.
  2. 2「다음 큰 원소」에서 원소마다의 답과, 스택이 단계마다 어떻게 바뀌는지 봅니다.
  3. 3같은 값을 어떻게 볼지(> 와 ≥)를 바꿔 보면 답이 달라지는 것을 확인할 수 있습니다.
  4. 4「최대 직사각형」으로 바꾸면 같은 스택으로 히스토그램의 가장 넓은 직사각형을 찾습니다.
  5. 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일 · 결과는 참고용 추정치입니다.