[백준] 2304_창고 다각형 python

김동완·2022년 4월 24일
3

알고리즘

목록 보기
27/55
post-thumbnail

창고 다각형

문제

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

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

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

img

그림1 . 기둥과 지붕(굵은 선)의 예

창고 주인은 창고 다각형의 면적이 가장 작은 창고를 만들기를 원한다. 그림 1에서 창고 다각형의 면적은 98 ㎡이고, 이 경우가 가장 작은 창고 다각형이다.

기둥들의 위치와 높이가 주어질 때, 가장 작은 창고 다각형의 면적을 구하는 프로그램을 작성하시오.

입력

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

출력

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

해결 방법

  • x축 순으로 기둥을 정렬한 후 가장 높은 기둥을 알아낸다.
  • 가장 왼쪽의 기둥 높이를 기준으로 가장 높은 기둥 전까지 면적을 계속 더하는데, 현재 기둥보다 다음 기둥이 더 작으면 기준의 높이를 더해주고 다음 기둥이 더 크다면 기준이 되는 높이를 갱신한다.
  • 오른쪽에서부터도 똑같이 온다.
n = int(input())

lst = []
result = 0
for i in range(n) :
    a,b = map(int,input().split())
    lst.append([a,b])
#기둥을 x축 순으로 정렬한다. 
lst.sort()

#가장 높은 기둥의 번호를 알아낸다. 
i = 0
for l in lst :
    if l[1] >result :
        result = l[1]
        idx = i
    i += 1

#초기 높이는 첫번째 기둥의 높이 
height = lst[0][1]

#최대 높이전까지 돌면서 다음 기둥이 현재보다 높으면 
#result에 현재의 면적을 계산해서 더해주고 높이를 다음 기둥으로 갱신한다.
for i in range(idx) :
    if height < lst[i+1][1] :
        result += height * (lst[i+1][0]-lst[i][0])
        height = lst[i+1][1]
    #아니면 그냥 현재면적을 더해준다. 
    else :
        result += height * (lst[i+1][0] - lst[i][0])

#뒤에서부터도 똑같이 진행한다. 
height = lst[-1][1]

for i in range(n-1, idx, -1) :
    if height < lst[i-1][1] :
        result += height * (lst[i][0]-lst[i-1][0])
        height = lst[i-1][1]
    else :
        result += height * (lst[i][0] - lst[i-1][0])

print(result)
profile
내가 공부한 내용들이 누군가에게 도움이 될지 몰라서 쓰는 벨로그

1개의 댓글

comment-user-thumbnail
2024년 1월 18일

감사합니다

답글 달기