[백준 BOJ_6549] 히스토그램에서 가장 큰 직사각형 Python 풀이

출처: 백준 온라인 저지

문제

BOJ_6549_1 BOJ_6549_2

풀이

문제를 분할하기 위해 아래의 그림과 같이 히스토그램을 반으로 나눈 뒤 가장 큰 직사각형이 왼쪽에 있는 경우와 오른쪽에 있는 경우, 그리고 나눈 중간에 걸쳐있는 경우 세가지로 분할해주었습니다.

BOJ_6549_3

왼쪽과 오른쪽의 경우 중 큰 값으로 저장해둔 뒤에 중간에 하나씩 걸쳐있는 것부터 높이가 높은 쪽으로 늘려가며 가장 낮은 높이 또한 저장해가며 비교했습니다.

코드

def solve(blocks, left, right):
    if left == right:
        return blocks[left]
    mid = (left+right) // 2
    ret = max(solve(blocks, left, mid), solve(blocks, mid+1, right))
    lo, hi = mid, mid+1
    height = min(blocks[lo], blocks[hi])
    ret = max(ret, height*2)
    while lo > left or hi < right:
        if lo > left and (hi == right or blocks[lo-1] > blocks[hi+1]):
            lo -=1
            height = min(height, blocks[lo])
        else:
            hi +=1
            height = min(height, blocks[hi])
        ret = max(ret, height*(hi-lo+1))
    return ret
result = []
while(1):
    blocks = list(map(int, input().split()))
    N = blocks[0]
    blocks = blocks[1:]
    if N == 0:
        break
    result.append(solve(blocks, 0, len(blocks)-1))
print(*result, sep="\n")

Leave a comment