2304번: 창고 다각형
문제 )
N 개의 막대 기둥이 일렬로 세워져 있다. 기둥들의 폭은 모두 1 m이며 높이는 다를 수 있다. 이 기둥들을 이용하여 양철로 된 창고를 제작하려고 한다. 창고에는 모든 기둥이 들어간다. 이 창고의 지붕을 다음과 같이 만든다.
- 지붕은 수평 부분과 수직 부분으로 구성되며, 모두 연결되어야 한다.
- 지붕의 수평 부분은 반드시 어떤 기둥의 윗면과 닿아야 한다.
- 지붕의 수직 부분은 반드시 어떤 기둥의 옆면과 닿아야 한다.
- 지붕의 가장자리는 땅에 닿아야 한다.
- 비가 올 때 물이 고이지 않도록 지붕의 어떤 부분도 오목하게 들어간 부분이 없어야 한다.
그림 1은 창고를 옆에서 본 모습을 그린 것이다. 이 그림에서 굵은 선으로 표시된 부분이 지붕에 해당되고, 지붕과 땅으로 둘러싸인 다각형이 창고를 옆에서 본 모습이다. 이 다각형을 창고 다각형이라고 하자.
![](https://blog.kakaocdn.net/dn/cqQMp5/btrtgraH3iK/rTsfcXI7MoDc7vRpQjmXAK/img.png)
창고 주인은 창고 다각형의 면적이 가장 작은 창고를 만들기를 원한다. 그림 1에서 창고 다각형의 면적은 98 ㎡이고, 이 경우가 가장 작은 창고 다각형이다.
기둥들의 위치와 높이가 주어질 때, 가장 작은 창고 다각형의 면적을 구하는 프로그램을 작성하시오.
입력 :
첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의 빈 칸을 사이에 두고 주어진다. L과 H는 둘 다 1 이상 1,000 이하이다.
출력 :
첫 줄에 창고 다각형의 면적을 나타내는 정수를 출력한다.
풀이)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
T = int(input())
li = [0 for i in range(1001)] # 블록이 놓일 수 있는 전체 공간
for i in range(T):
l, h = map(int, input().split())
li[l] = h
top = max(li) # 창고가 가질 수 있는 최대값.
total = 0
s = 0
high = 0
while True: # 왼쪽 부분
if li[s] == top:
break
else:
if li[s] > high:
high = li[s]
total += high
s += 1
else:
s += 1
total += high
e = 1000
high = 0
while True: # 왼쪽 부분
if li[e] == top:
break
else:
if li[e] > high:
high = li[e]
total += high
e -= 1
else:
e -= 1
total += high
if s == e:
total += top * 1
else:
total += (e - s + 1) * top
print(total)
|
cs |
출처 : https://www.acmicpc.net/problem/2304
2304번: 창고 다각형
첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의
www.acmicpc.net
'Develop > 백준 (python)' 카테고리의 다른 글
[백준] 2564번: 경비원 (python) (0) | 2022.02.14 |
---|---|
[백준] 2527번: 직사각형 (python) (0) | 2022.02.14 |
[백준] 10157번: 자리배정 (python) (0) | 2022.02.13 |
[백준] 2491번: 수열 (python) (0) | 2022.02.12 |
[백준] 14696번: 딱지놀이 (python) (0) | 2022.02.12 |