문제 : https://www.acmicpc.net/problem/2493
건물 높이들을 입력받은 후 뒤에서부터 레이저 신호를 보내고, 해당 레이저 신호가 몇번째 건물가지 도달하는지 체크하면 되는 문제이다. 문제 해석은 간단하니 자세한 설명은 생략한다.
해당 건물에서 순차적으로 읽어올 때 가장 큰 건물의 위치만 알아내면 된다. 따라서 레이저를 최종적으로 수신하는 건물의 위치만 알아내면 되는 것이다. 그러면 해당 건물에서 0번째 건물까지 계속해서 탐색하면 되는것인가?
그렇게 하면 당연히 n * n 의 시간이 걸릴 것이므로 시간초과가 발생할 것이다. 따라서 효과적으로 가장 높은 건물의 위치만을 알아내는 방법이 필요하다. 이때 필요한 것이 바로 스택이다.
n = int(input())
heights = list(map(int,input().split()))
stack = []
outputs = [0 for _ in range(n)]
for i in range(len(heights)-1,-1,-1):
h = heights[i]
if not stack:
stack.append((h,i))
continue
while stack and stack[-1][0]<h:
_, idx = stack.pop()
outputs[idx] = i+1
stack.append((h,i))
print(' '.join(map(str,outputs)))
deque를 사용하여 풀 수 있지만, 필자는 list method인 pop과 append를 이용하여 해결하였다. 여기서 중요한 것은 pop()할 때 인자값을 안넣어주면 가장 마지막꺼를 remove한다는 것!!
(queue처럼 맨 앞에꺼 없어지는 걸로 착각해서 몇번 틀렸다..)