다음과 같은 풀이 공식이 있는 문제이다.
stack
자료 형태로 보관된다.i
번째의 막대 높이가 stack
에 저장된 마지막 높이의 막대보다 낮을 경우 다음 로직을 수행한다.function largestRectangleArea(heights: number[]): number {
const stack = [];
let maxArea = 0;
const n = heights.length;
// 모든 막대를 순회 (마지막에 0을 추가하여 남은 계산 처리)
for (let i = 0; i <= n; i++) {
const h = i === n ? 0 : heights[i];
// 스택이 비어있지 않고, 현재 높이가 스택의 top에 있는 막대의 높이보다 작은 경우
while (stack.length > 0 && h < heights[stack[stack.length - 1]]) {
const height = heights[stack.pop()];
const width = stack.length === 0 ? i : i - stack[stack.length - 1] - 1;
maxArea = Math.max(maxArea, height * width);
}
stack.push(i);
}
return maxArea;
}