[BOJ][⚪2][백준#02304] 창고 다각형

작성:    

업데이트:

카테고리:

태그: , , ,

문제 출처

BAEKJOON Online Judge #2304


문제

N 개의 막대 기둥이 일렬로 세워져 있다. 기둥들의 폭은 모두 1 m이며 높이는 다를 수 있다. 이 기둥들을 이용하여 양철로 된 창고를 제작하려고 한다. 창고에는 모든 기둥이 들어간다. 이 창고의 지붕을 다음과 같이 만든다.

지붕은 수평 부분과 수직 부분으로 구성되며, 모두 연결되어야 한다. 지붕의 수평 부분은 반드시 어떤 기둥의 윗면과 닿아야 한다. 지붕의 수직 부분은 반드시 어떤 기둥의 옆면과 닿아야 한다. 지붕의 가장자리는 땅에 닿아야 한다. 비가 올 때 물이 고이지 않도록 지붕의 어떤 부분도 오목하게 들어간 부분이 없어야 한다.

그림 1은 창고를 옆에서 본 모습을 그린 것이다. 이 그림에서 굵은 선으로 표시된 부분이 지붕에 해당되고, 지붕과 땅으로 둘러싸인 다각형이 창고를 옆에서 본 모습이다. 이 다각형을 창고 다각형이라고 하자.

그림1 . 기둥과 지붕(굵은 선)의 예 창고 주인은 창고 다각형의 면적이 가장 작은 창고를 만들기를 원한다. 그림 1에서 창고 다각형의 면적은 98 ㎡이고, 이 경우가 가장 작은 창고 다각형이다. 기둥들의 위치와 높이가 주어질 때, 가장 작은 창고 다각형의 면적을 구하는 프로그램을 작성하시오.


입력

첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의 빈 칸을 사이에 두고 주어진다. L과 H는 둘 다 1 이상 1,000 이하이다.


출력

첫 줄에 창고 다각형의 면적을 나타내는 정수를 출력한다.


예제

입력

7
2 4
11 4
15 8
4 6
5 3
8 10
13 6


출력

98


My Sol

import sys
input = sys.stdin.readline

N = int(input())
hs = [0]*1010
maxh = 0
for _ in range(N):
    i, h = map(int, input().split())
    maxh = max(maxh, h)
    hs[i] = h

sumL = sumC = sumR = 0

li = 0
lh = 0
while not hs[li]==maxh:
    lh = max(lh, hs[li])
    sumL += lh
    li += 1


ri = 1009
rh = 0
while not hs[ri-1]==maxh:
    rh = max(rh, hs[ri-1])
    sumR += rh
    ri -= 1

sumC = (ri-li)*maxh
print(sumL + sumR + sumC)

한 달 전에 정말 오래 풀어도 못 풀었던 문제였는데, 오늘은 수업 쉬는시간에 10분만에 풀어버려서 감회가 새로운 문제였다.

범위가 1000이기 때문에 그냥 적당히 1010정도로 두고 배열을 초기화했다. 입력을 인덱스와 값으로 위치와 높이를 입력받고, 양쪽에서 더해오다가 최고 높이를 만나면 정지하는 방식을 사용하였다. 어느쪽이든 최고 높이를 만나면 그때부터는 계속 최고 높이이기 때문에 중앙부분, 좌측, 우측 부분으로 3등분하여 나누어 계산하였다. 위치를 왼쪽 기준으로 하였기 때문에 오른쪽에서 while문으로 줄여오는 때에 높이 파악을 실수 없이 해줄 필요가 있었다.


결과

맞았습니다!!


모범답안

출처

# empty

댓글남기기