https://www.acmicpc.net/problem/1725
지난번에 풀이한 히스토그램 문항이랑 같다. 근데 지난번 풀이때 놓친 부분이 있어서 간단히 소개하려한다.
# PYTHON CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
n = int(input())
s1 = [int(input()) for _ in range(n)]
s2 = [0]
answer = 0
s1.insert(0, 0)
s1.append(0)
for i in range(1, n + 2):
while s2 and s1[s2[-1]] > s1[i]:
k = s2.pop()
answer = max(answer, (i - s2[-1] - 1) * s1[k])
s2.append(i)
print(answer)
|
cs |
히스토그램에서 우리가 알고 있어야 하는 정보는 각 직사각형의 높이, 너비다. 두가지를 이용하여 직사각형의 넓이를 구하기에 유용한 정보를 담을 스택을 만들어야 하는데, 이때 스택의 구조는 본인보다 작은 높이가 들어오면 pop, 높은 높이가 들어오면 push를 진행해주어 높이 순으로 갱신되도록 해주는 구조를 이루어야한다.
* line3 : 너비 계산시 s2[-1]을 불러올 경우 IndexError를 방지함.
* line5 : 가장 작은 높이인 0을 배치해서 알고리즘에는 지장을 주지 않으며 s2[0]과 조화를 맞추어 index를 깔끔히 함.
* line6 : s2에 처리되지 않고 남아있는 인덱스들을 정리 가능하게 해줌.
'백준 > 스택' 카테고리의 다른 글
[Python] 백준, 2812(스택) (0) | 2021.08.06 |
---|---|
[Python] 백준, 3986(스택) (0) | 2021.08.06 |
[Python] 백준, 1935(스택) (0) | 2021.08.02 |
[Python] 백준, 9935(스택) (0) | 2021.08.02 |
[Python] 백준, 6549(스택) (0) | 2021.08.01 |