[백준/Baekjoon] 2304번: 창고 다각형
1. 문제
N 개의 막대 기둥이 일렬로 세워져 있다. 기둥들의 폭은 모두 1 m이며 높이는 다를 수 있다. 이 기둥들을 이용하여 양철로 된 창고를 제작하려고 한다. 창고에는 모든 기둥이 들어간다. 이 창고의 지붕을 다음과 같이 만든다.
- 지붕은 수평 부분과 수직 부분으로 구성되며, 모두 연결되어야 한다.
- 지붕의 수평 부분은 반드시 어떤 기둥의 윗면과 닿아야 한다.
- 지붕의 수직 부분은 반드시 어떤 기둥의 옆면과 닿아야 한다.
- 지붕의 가장자리는 땅에 닿아야 한다.
- 비가 올 때 물이 고이지 않도록 지붕의 어떤 부분도 오목하게 들어간 부분이 없어야 한다.
그림 1은 창고를 옆에서 본 모습을 그린 것이다. 이 그림에서 굵은 선으로 표시된 부분이 지붕에 해당되고, 지붕과 땅으로 둘러싸인 다각형이 창고를 옆에서 본 모습이다. 이 다각형을 창고 다각형이라고 하자.
그림1 . 기둥과 지붕(굵은 선)의 예
창고 주인은 창고 다각형의 면적이 가장 작은 창고를 만들기를 원한다. 그림 1에서 창고 다각형의 면적은 98 ㎡이고, 이 경우가 가장 작은 창고 다각형이다.
기둥들의 위치와 높이가 주어질 때, 가장 작은 창고 다각형의 면적을 구하는 프로그램을 작성하시오.
2. 입력
첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의 빈 칸을 사이에 두고 주어진다. L과 H는 둘 다 1 이상 1,000 이하이다.
3. 출력
첫 줄에 창고 다각형의 면적을 나타내는 정수를 출력한다.
4. 예제 입력 1
7
2 4
11 4
15 8
4 6
5 3
8 10
13 6
5. 예제 출력 1
98
6. 풀이
문제의 핵심 아이디어는 가장 높은 기둥을 기준으로 왼쪽과 오른쪽에서 다가가며 면적을 구해야 한다는 것이다.
먼저, 값을 입력받을 때 정렬되지 않은 위치로 입력을 받기 때문에, 우선 입력을 받으며 가장 높은 기둥의 높이와 위치를 구한다. 이후 받은 입력을 다시 한 번 정렬하게 된다.
idx = (-1, -1) # 가장 높은 기둥의 높이와 위치를 저장
length = 0 # 가장 높은 기둥의 높이를 저장
temp = [] # 입력받은 값들을 임시로 저장
for _ in range(n):
l, h = map(int, input().split())
if h > idx[1]:
idx = (l, h)
length = max(length, l)
temp.append((l, h))
data = [0] * (length + 1) # 입력받은 값들을 위치에 따라 정렬하여 저장
for l, h in temp:
data[l] = h # 입력받은 값들을 위치에 따라 정렬
또한, 각각 왼쪽과 오른쪽에서 높은 기둥을 찾아가며 면적을 구한다.
high = data[0] # 왼쪽에서 가장 높은 기둥 초기화
result = 0
# 왼쪽부터 가장 높은 기둥까지의 면적을 구함
for i in range(idx[0] + 1):
if data[i] > high:
high = data[i]
result += high
high = data[-1] # 오른쪽에서 가장 높은 기둥 초기화
# 오른쪽부터 가장 높은 기둥까지의 면적을 구함
for i in range(length, idx[0], -1):
if data[i] > high:
high = data[i]
result += high
7. 코드
n = int(input())
idx = (-1, -1)
length = 0
temp = []
for _ in range(n):
l, h = map(int, input().split())
if h > idx[1]:
idx = (l, h)
length = max(length, l)
temp.append((l, h))
data = [0] * (length + 1)
for l, h in temp:
data[l] = h
high = data[0]
result = 0
for i in range(idx[0] + 1):
if data[i] > high:
high = data[i]
result += high
high = data[-1]
for i in range(length, idx[0], -1):
if data[i] > high:
high = data[i]
result += high
print(result)
Leave a comment