PS

BOJ 2304

plr3270 2021. 11. 14. 21:25

기둥이 되는 것을 구하는건 되게 쉬웠다

 

하지만 기둥을 가지고 넓이를 구하는걸 2시간 걸려서 풀었다..

그래도 득은 있었다고 생각함

 

 

소스코드


n = int(input())
ls = []
for i in range(n):
    ls.append(list(map(int,input().split())))
ls.sort(key=lambda x : x[0])
stack = []
for i in range(n):
    if len(stack) == 0:
        stack.append(ls[i])
    elif stack[-1][1] <=ls[i][1]:
        if len(stack) == 1 or stack[-2][1] <= stack[-1][1]:
            stack.append(ls[i])
        else:
            while not (len(stack) == 1 or stack[-2][1] <= stack[-1][1]  or stack[-1][1] > ls[i][1]):
                stack.pop()
            stack.append(ls[i])
    else:
        stack.append(ls[i])
stack1 = stack[::-1]
if len(stack) == 1:
    print(stack[0][1])
else:
    s = 0
    ah = 0
    h = 0
    bh = 0

    saveA = []
    for i in range(len(stack)):
        
        if i == 0:
            saveA = stack[i]
            continue
        if stack[i][1] > saveA[1]:
            s+= saveA[1] * (stack[i][0]-saveA[0])
            saveA = stack[i]
        elif stack[i][1] == saveA[1]:
            pass
        else:
            pass
    ah = saveA[0]
    h = saveA[1]
        
   
    for i in range(len(stack1)):
        if i == 0:
            saveA = stack1[i]
            continue
        if stack1[i][1] > saveA[1]:
            s+= saveA[1] * (saveA[0]-stack1[i][0])
            saveA = stack1[i]
        elif stack1[i][1] == saveA[1]:
            pass
        else:
            pass
    bh = saveA[0]
    s+=(bh-ah+1)*h
    print(s)