[백준-실버2]2304 창고 다각형 - python

iamjinseo·2022년 11월 12일
0

문제풀이-Python

목록 보기
132/134


https://www.acmicpc.net/workbook/view/8399 여기서 참고
https://www.acmicpc.net/problem/2304


문제 설명

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

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

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

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

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

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

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


풀이

import sys

input = sys.stdin.readline

highest = 0
highest_loc = 0
farthest = 0
n = int(input())
li = []
for i in range(n):
    l, h = map(int, input().split())
    li.append((l, h))
    if farthest < l:
        farthest = l
    if highest < h:
        highest = h
        highest_loc = l

pillar = [0] * (farthest + 1)
for l, h in li:
  pillar[l] = h
  
ans = 0
temp = 0  #이전 기둥 정보 저장
for i in range(highest_loc + 1):  #최고점 까지의 기둥 세우기
    if temp < pillar[i]:  #이전 기둥보다 높아야됨
        temp = pillar[i]
    ans += temp  #현재 기둥 높이에 따라 현재 값 또는 이전 기둥 값 들어감
temp = 0
for i in range(farthest, highest_loc, -1):  #최고점 이후의 기둥 세우기
    if temp < pillar[i]:  #현재 기둥이 오른쪽에 있던 기둥보다 높아야함
        temp = pillar[i]
    ans += temp
print(ans)
  1. 최고높이와 최고점, 그리고 가장 멀리 떨어진 기둥 정보를 계산한다.
    그 후 모든 기둥을 탐색할 수 있는 pillar를 만든다.
    pillar에서 각 지점의 기둥 높이를 삽입한다.

  2. 왼쪽부터 최고점까지 오목한 부분이 생기지 않도록, 왼쪽 기둥보다 높을 때만 지붕으로 설정한다. 그렇지 않으면 이전 기둥을 지붕으로 설정한다.
    그리고 결과(ans)에 더한다.

  3. 오른쪽부터 최고점 이후까지 오목한 부분이 생기지 않도록, 오른쪽 기둥보다 높을 때만 지붕으로 설정한다. 그렇지 않으면 이전 기둥을 지붕으로 설정한다.
    그리고 결과(ans)에 더한다.

결과

후기

사실 이거 구글링한거임ㅎㅎ;;;(참고) 아니 문제푸는데 너무 오래걸려서 그만....
안되는 문제 붙잡느니 구글링해서 배우는 게 천만 배 낫다고 생각합니다

그리고 이번 풀이를 통해 복잡하게 생각할 수록 정답이 아니라는 말을 한번 더 되새길 수 있었다.

이전에는 겁나 복잡하게 풀었다. 심지어 O(N^2)였음 ㅎㅎ

profile
일단 뭐라도 해보는 중

0개의 댓글