히스토그램은 직사각형 여러 개가 아래쪽으로 정렬되어 있는 도형이다. 각 직사각형은 같은 너비를 가지고 있지만, 높이는 서로 다를 수도 있다. 예를 들어, 왼쪽 그림은 높이가 2, 1, 4, 5, 1, 3, 3이고 너비가 1인 직사각형으로 이루어진 히스토그램이다.
히스토그램에서 가장 넓이가 큰 직사각형을 구하는 프로그램을 작성하시오.
예제 입력 | 예제 출력 |
7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0 |
8 4000 |
문제 풀이
가장 큰 직사각형을 구해야 함으로, 지금의 길이가 이전 길이보다 길다면 스택에 넣는 방식으로 구현했다. 그렇게 하나씩 넣다가 이전보다 짧은 길이가 나타나면 현재까지 스택에 들어있는 값들을 가지고 만들 수 있는 가장 큰 넓이를 구한다.
풀이 과정
전체 코드
import sys
input = sys.stdin.readline
while True:
values = list(map(int, input().split()))
# 0일 때 종료
count = values[0]
if count == 0:
break
else:
values.pop(0)
total_sum = 0
stack = []
for i in range(count):
width = i
# 왼쪽 > 오른쪽 일 때
while stack and stack[-1][0] >= values[i]:
height, width = stack.pop()
total_sum = max(total_sum, height * (i-width))
# 높이, 넓이
stack.append([values[i], width])
for h, w in stack:
total_sum = max(total_sum, h*(count-w))
print(total_sum)
'꾸준히 하기 > 알고리즘' 카테고리의 다른 글
백준 11000 강의실 배정 파이썬 (0) | 2023.10.06 |
---|---|
백준 1689 겹치는 선분 파이썬 (0) | 2023.10.06 |
백준 10000 원 영역 파이썬 (0) | 2023.09.21 |
백준 2504 괄호의 값 파이썬 (0) | 2023.09.20 |
백준 2261 가장 가까운 두 점 파이썬 (0) | 2023.09.18 |