

N 개의 막대 기둥이 일렬로 세워져 있다. 기둥들의 폭은 모두 1 m이며 높이는 다를 수 있다. 이 기둥들을 이용하여 양철로 된 창고를 제작하려고 한다. 창고에는 모든 기둥이 들어간다. 이 창고의 지붕을 다음과 같이 만든다.
- 지붕은 수평 부분과 수직 부분으로 구성되며, 모두 연결되어야 한다.
- 지붕의 수평 부분은 반드시 어떤 기둥의 윗면과 닿아야 한다.
- 지붕의 수직 부분은 반드시 어떤 기둥의 옆면과 닿아야 한다.
- 지붕의 가장자리는 땅에 닿아야 한다.
- 비가 올 때 물이 고이지 않도록 지붕의 어떤 부분도 오목하게 들어간 부분이 없어야 한다.
그림 1은 창고를 옆에서 본 모습을 그린 것이다. 이 그림에서 굵은 선으로 표시된 부분이 지붕에 해당되고, 지붕과 땅으로 둘러싸인 다각형이 창고를 옆에서 본 모습이다. 이 다각형을 창고 다각형이라고 하자.

그림1 . 기둥과 지붕(굵은 선)의 예
창고 주인은 창고 다각형의 면적이 가장 작은 창고를 만들기를 원한다. 그림 1에서 창고 다각형의 면적은 98 ㎡이고, 이 경우가 가장 작은 창고 다각형이다.
기둥들의 위치와 높이가 주어질 때, 가장 작은 창고 다각형의 면적을 구하는 프로그램을 작성하시오.
입력
첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의 빈 칸을 사이에 두고 주어진다. L과 H는 둘 다 1 이상 1,000 이하이다.
출력
첫 줄에 창고 다각형의 면적을 나타내는 정수를 출력한다.
풀이 과정
비가 올 때 물이 고이지 않도록 지붕의 어떤 부분도 오목하게 들어간 부분이 없어야 하므로, 이를 고려한 아이디어가 필요하다.
먼저, 왼쪽부터 높이가 증가하는 순서대로 창고 다각형을 씌운다.
그리고, 오른쪽부터 높이가 증가하는 순서대로 창고 다각형을 씌운다.
이 때 두 결과의 최솟값 높이를 가로 한 칸마다 계산해주면 창고 다각형의 면적을 얻을 수 있다.


import sys
input = sys.stdin.readline
n = int(input().rstrip())
arr = [list(map(int, input().rstrip().split())) for _ in range(n)]
arr.sort(key=lambda x:x[0])
height_arr = [0 for _ in range(arr[-1][0]+1)]
idx = 0
now_height = 0
for i in range(arr[0][0], arr[-1][0]+1):
if idx == 0:
now_height = arr[0][1]
idx += 1
else:
if arr[idx][0] == i:
if now_height < arr[idx][1]:
now_height = arr[idx][1]
idx += 1
height_arr[i] = now_height
idx = n - 1
now_height = 0
for i in range(arr[-1][0], arr[0][0]-1, -1):
if idx == n - 1:
now_height = arr[-1][1]
idx -= 1
else:
if arr[idx][0] == i:
if now_height < arr[idx][1]:
now_height = arr[idx][1]
idx -= 1
height_arr[i] = min(height_arr[i], now_height)
print(sum(height_arr))
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 15558 : 점프 게임 ( GOLD 5 ) / Python (0) | 2024.02.09 |
---|---|
[ BOJ ] 16943 : 숫자 재배치 ( SILVER 1 ) / Python (0) | 2024.02.09 |
[ BOJ ] 12845 : 모두의 마블 ( SILVER 3 ) / Python (0) | 2024.02.09 |
[ BOJ ] 17472 : 다리 만들기 2 ( GOLD 1 ) / Python (0) | 2024.02.08 |
[ BOJ ] 14725 : 개미굴 ( GOLD 3 ) / Python (0) | 2024.02.08 |