Algorithm/BaekJoon

(파이썬) 백준 1725번 "히스토그램"

innit 2023. 9. 27. 12:14


# 문제상황

 

 

 

 


# 스택을 이용한 풀이

일정 구간에서 가장 큰 직사각형의 넓이는 (해당 구간의 너비) x (해당 구간에서의 높이 최솟값) 입니다.

스택의 top이 나보다 크다면, 계속해서 pop합니다. 즉 스택의 top에는 늘 최댓값이 들어있도록 합니다.

스택을 pop 하며 뒤로 돌아가는 과정에서, 정답이 될 수 있는 모든 직사각형 넓이를 탐색할 수 있습니다.

 

현재 나의 위치에서부터 뒤로 탐색하는 것이기 때문에, 뒤로 가면 갈수록 높이(= 스택에서 pop한 값)는 낮아집니다.

즉, (뒤로 탐색한 거리) x (pop한 값)이 직사각형 넓이가 됩니다.

import sys
input = sys.stdin.readline

n = int(input())
stk = []
l = 0
ans = 0

for r in range(n):
    l = r
    x = int(input())

    while stk and stk[-1][1] > x:
        l, y = stk.pop()
        ans = max(ans, y * (r - l))
    stk.append((l, x))

while stk:
    l, y = stk.pop()
    ans = max(ans, y * (n - l))

print(ans)

 

 

 

728x90
반응형