문제 링크
https://www.acmicpc.net/problem/2493
잡담
초반에 좀 많이 헤맸다. 당장 안풀릴 때는 나중에 푸는 게 확실히 나은 것 같다.
구현
먼저 시간복잡도를 계산해보자. 문제에 $N \le 50$ 이라고 명시되어있다. 즉,
- $O(N): 500,000$
- $O(Nlog{N}): Nlog{N} \thickapprox 500,000 \times 19 \thickapprox 9,500,000$
- $O(N^2): N^2 = 250,000,000,000$
$O(N^2)$이상으로 가면 시간초과가 날 것이다.
문제를 보면
10 6 5 4 3 2 7 5 9 의 탑이 있을 때, 7을 기준으로 보면 6 ~ 2의 탑들은 신경 쓸 필요가 없다는 뜻이다. 이 다음부터는 구현이 쉽다.
코드
from sys import stdin
input = stdin.readline
def main():
n = int(input())
tower = list(map(int, input().split()))
stack = []
idx = 0
value = 1
for i in range(n):
if stack:
if tower[i] < stack[-1][value]:
print(stack[-1][idx], end=' ')
else:
while stack and stack[-1][value] < tower[i]:
stack.pop()
if stack:
print(stack[-1][idx], end=' ')
else:
print(0, end=' ')
else:
print(0, end=' ')
stack.append((i + 1, tower[i]))
if __name__ == '__main__':
main()