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)
최고높이와 최고점, 그리고 가장 멀리 떨어진 기둥 정보를 계산한다.
그 후 모든 기둥을 탐색할 수 있는 pillar
를 만든다.
pillar
에서 각 지점의 기둥 높이를 삽입한다.
왼쪽부터 최고점까지 오목한 부분이 생기지 않도록, 왼쪽 기둥보다 높을 때만 지붕으로 설정한다. 그렇지 않으면 이전 기둥을 지붕으로 설정한다.
그리고 결과(ans
)에 더한다.
오른쪽부터 최고점 이후까지 오목한 부분이 생기지 않도록, 오른쪽 기둥보다 높을 때만 지붕으로 설정한다. 그렇지 않으면 이전 기둥을 지붕으로 설정한다.
그리고 결과(ans
)에 더한다.
사실 이거 구글링한거임ㅎㅎ;;;(참고) 아니 문제푸는데 너무 오래걸려서 그만....
안되는 문제 붙잡느니 구글링해서 배우는 게 천만 배 낫다고 생각합니다
그리고 이번 풀이를 통해 복잡하게 생각할 수록 정답이 아니라는 말을 한번 더 되새길 수 있었다.
이전에는 겁나 복잡하게 풀었다. 심지어 O(N^2)였음 ㅎㅎ