https://www.acmicpc.net/problem/6198
6198번: 옥상 정원 꾸미기
문제 도시에는 N개의 빌딩이 있다. 빌딩 관리인들은 매우 성실 하기 때문에, 다른 빌딩의 옥상 정원을 벤치마킹 하고 싶어한다. i번째 빌딩의 키가 hi이고, 모든 빌딩은 일렬로 서 있고 오른쪽으
www.acmicpc.net
stack을 사용하지 않고 이중 for문을 쓰면 시간 초과가 된다.
계산 횟수를 줄이기 위해 stack을 사용하여 '건물이 바라볼 수 있는 빌딩의 개수'가 아닌 '건물을 바라볼 수 있는 빌딩의 개수'를 구해서 더해줘야 한다.
for문이 한 바퀴 돌면 stack에는 가장 왼쪽에 있는 건물의 높이가 추가된다.
이후, for문이 계속 돌면서 자신보다 왼쪽에 있는 건물들 중 stack에 남아있는 건물과 높이를 비교한다.
만약, 왼쪽에 있는 건물 중 자신보다 높은 건물이 있으면 반복을 멈추고 stack의 크기를 합계에 더한다.
그냥 보면 이중 for문과 비슷해 보이지만 중복 계산을 줄일 수 있다는 점에서 시간을 많이 단축할 수 있다.
import sys
input = sys.stdin.readline
N = int(input())
height = []
stack = []
sum = 0
for i in range(N):
height.append(int(input()))
for i in range(0, N):
while len(stack) != 0 and stack[-1] <= height[i]:
stack.pop()
sum += len(stack)
stack.append(height[i])
print(sum)
'알고리즘 > 백준' 카테고리의 다른 글
[백준 5430][파이썬] AC (0) | 2022.02.12 |
---|---|
[백준 10845][파이썬] 큐 (0) | 2022.02.12 |
[백준 2841][파이썬] 외계인의 기타 연주 (0) | 2022.02.11 |
[백준 10828][파이썬] 스택 (0) | 2022.02.11 |
[백준 11399][파이썬] ATM (0) | 2021.08.03 |