프론트엔드 개발자 중규리 입니다 ദി ᷇ᵕ ᷆ ) 자세히보기

PS/문제풀이

백준 2304 창고 다각형 Python

중규리 2024. 1. 26. 11:24

🐸 문제 정보

 

2304번: 창고 다각형

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

www.acmicpc.net

 

🤖 알고리즘

스택

(이라고 적혀있지만 구현에 가깝다)

 

⏱️ 풀이 시간

30.25m

 

📝 풀이

보자마자 스택 문제인 것은 알았지만, 스택보다는 구현에 가까운 문제였다.

가장 높은 지점을 기준으로, 왼쪽 오른쪽에서 최대값은 의미가 없다는 것을 알아야했다.

때문에 입력 값에서 가장 높은 지점의 인덱스를 찾은 후, 그 지점을 기준으로 왼쪽 오른쪽 각 1회씩 탐색하면서 스택 형태로 값을 더해주면 되는 문제였다.

 

문제에서 모든 인덱스에 h가 있는 것은 아니기 때문에 defaultdict를 이용해서 시간복잡도를 조금이라도 줄이고자 했다.

 

🧑‍💻 나의 답

# pypy3

import sys
from collections import defaultdict
input = sys.stdin.readline

n = int(input().rstrip())
blocks = defaultdict(int)
m, ml, mh = 0, 0, 0
for _ in range(n):
    l, h = list(map(int, input().rstrip().split()))
    blocks[l] = h
    if mh < h:
        mh = h
        ml = l
    m = max(m, l)

res = 0
temp = 0

for i in range(ml + 1):
    if temp < blocks[i]:
        temp = blocks[i]
    res += temp

temp = 0
for i in range(m, ml, -1):
    if temp < blocks[i]:
        temp = blocks[i]
    res += temp

print(res)