QA & Engineering Blog

A Blog about Quality · Automation · Engineering

🏠 홈으로

6549. 히스토그램에서 가장 큰 직사각형

업데이트 시간 : 2023-04-27 10:43:04 +0000

[Platinum V] 히스토그램에서 가장 큰 직사각형 - 6549

문제 링크

성능 요약

메모리: 143560 KB, 시간: 224 ms

분류

자료 구조, 분할 정복, 세그먼트 트리, 스택

문제 설명

히스토그램은 직사각형 여러 개가 아래쪽으로 정렬되어 있는 도형이다. 각 직사각형은 같은 너비를 가지고 있지만, 높이는 서로 다를 수도 있다. 예를 들어, 왼쪽 그림은 높이가 2, 1, 4, 5, 1, 3, 3이고 너비가 1인 직사각형으로 이루어진 히스토그램이다.

히스토그램에서 가장 넓이가 큰 직사각형을 구하는 프로그램을 작성하시오.

입력

입력은 테스트 케이스 여러 개로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 직사각형의 수 n이 가장 처음으로 주어진다. (1 ≤ n ≤ 100,000) 그 다음 n개의 정수 h1, ..., hn (0 ≤ hi ≤ 1,000,000,000)가 주어진다. 이 숫자들은 히스토그램에 있는 직사각형의 높이이며, 왼쪽부터 오른쪽까지 순서대로 주어진다. 모든 직사각형의 너비는 1이고, 입력의 마지막 줄에는 0이 하나 주어진다.

출력

각 테스트 케이스에 대해서, 히스토그램에서 가장 넓이가 큰 직사각형의 넓이를 출력한다.

💡 Solutions

📄 히스토그램에서 가장 큰 직사각형.py

while True:
    lst = list(map(int,input().split()))
    if lst[0] == 0:
        break
    
    N = lst[0]
        
    stack = []
    max_rlt = 0
    lst = lst[1:]
    for i in range(N):
        height = lst[i]
        stack_i = i
        while stack and stack[-1][1] > height:  # 스택에서 빼내며 최대 직사각형 넓이를 계산
            # 스택에 들어있는 막대 중에서 현재 막대의 길이보다 큰 것들만 꺼내서 계산
            stack_i, stack_height = stack.pop()
            result = (i - stack_i) * stack_height
            max_rlt = max(result, max_rlt) # 최대값 갱신
            

        stack.append((stack_i, height))  # 스택에 현재 막대기를 추가
            
    # 반복이 종료되고, 스택에 남은 막대기가 있다면 계산
    while stack:
        stack_i, stack_height = stack.pop()
        result = (N - stack_i) * stack_height
        max_rlt = max(result, max_rlt) # 최대값 갱신  
        
    print(max_rlt)