💡 조금 더 열심히 공부해야겟다..ㅎ

# 시간제한이 1.5초이기 때문에, for문은 1번만 사용하기 ( 스택, 투포인터는 정렬필요하니 제외)
import sys
input = sys.stdin.readline
N = int(input())
tower = list(map(int, input().split(' ')))
position = [0] * N
stack = []
for i in range(N):
while stack:
if tower[i] > tower[stack[-1]]:
stack.pop()
else:
position[i] = stack[-1] + 1
break
stack.append(i)
print(*position)
💡 풀이방법
- stack에는 현재의 index값이 1번씩 push 되어진다. ( 왼쪽 -> 오른쪽)
- push되기 전에 stack이 비어있지 않으면, stack의 마지막 원소와 현재 타워 높이를 비교한다.
=> stack의 마지막 원소가 현재 타워 보다 작으면, stack의 마지막 원소를 pop()한다. (stack이 빌때까지 반복)
=> stack의 마지막 원소가 현재 타워보다 크면, 해당 position에 현재 인덱스 값을 넣고 while문을 빠져 나간다.- 현재 index값을 스택에 추가한다.
+) for문 내부에 while문이 들어가면 결국은 최악의 상황때, O(N^2) 되는거 아니야?
=> stack을 사용했기 때문에 각 요소당 push도 1번, pop도 1번씩 일어나기 떄문에,
최악의 상황에도 2N만 돌기 때문에 O(N)이다.