import sys

input = sys.stdin.readline


while True:
    N,*arr = list(map(int,input().split()))

    if N == 0:
        break

    stack = [0]
    arr = [0] + arr[:] +[0]
    result = 0
    for ind in range(1,len(arr)):
        while stack and arr[ind] < arr[stack[-1]]:
            height = arr[stack[-1]]
            stack.pop()
            width = ind - stack[-1]-1
            result = max(result,height*width)
        stack.append(ind)

    print(result)

 이 문제는 boj.kr/11873 의 하위호환이다.

 

11873의 문제를 푼것과 같이 stack에 현재위 index 즉 가로길이를 넣어주는 걸 한다.

 

그리고 이걸 좀 더 쉽게 구하기 위해, 양 끝에 [0]을 추가를 해준다.

 

그러면 스택에서 마지막 값에 위치한 높이보다 작은 높이가 들어오면,

 

그때 스택에서 값을 추출해서, 지금까지의 거리를 측정을 해준다.

 

측정 방식은 현재 index에서 stack의 마지막값을 빼준 값에 -1을 해준것이다.

 

이렇게 2개의 값을 곱한뒤 최대값을 저장해주면 된다. 

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ/백준] 10421 수식 완성하기  (0) 2021.06.06
[BOJ/백준] 9470 Strahler 순서  (0) 2021.06.06
[BOJ/백준] 3665 최종 순위  (0) 2021.06.06
[BOJ/백준] 3165 5  (0) 2021.06.06
[BOJ/백준] 2623 음악 프로그램  (0) 2021.06.06

+ Recent posts