n = int(input())
top = list(map(int,input().split()))
answer = [0] * n
stack= []
for i in range(n):
while stack:
if stack[-1][1] > top[i]:
answer[i] = stack[-1][0] + 1
break
else:
stack.pop()
stack.append([i, top[i]])
print(*answer)
- stack에 들어간 값과 현재 값을 비교해서 stack에 들어있는 값이 더 크다면 현재 index + 1(0부터 시작했으니) 해준 값을 answer에 넣어준다. (들어가지 않는다면 자신보다 큰 경우가 없어서 초기화해주었던 값인 0이 그대로 출력된다.)
- 바로 직전의 값을 stack에 넣어서 뒤에 값이 큰지 작은지를 확인한 뒤 뒤에 값이 작다면 왼쪽으로 레이저를 보낼 때 수신되는 것을 의미하기에 해당 index에 +1 을 해주면 된다.
- 이때 바로 앞의 값이 작은 경우엔 stack에서 해당 수를 빼주고 바로 또 그 앞의 수를 확인해서 그 수보다 현재 수가 작으면 해당 index + 1 값을 answer 값으로 돌려준다.
'문제풀이 > 백준(Boj) 문제풀이' 카테고리의 다른 글
[백준][스택] - 1918. 후위 표기식(파이썬) (0) | 2022.07.17 |
---|---|
[백준][스택] - 10799. 쇠막대기(파이썬) (0) | 2022.07.17 |
[백준][이분 탐색] - 10815. 숫자 카드 (0) | 2022.07.08 |
[백준][이분 탐색] - 1654. 랜선 자르기 (0) | 2022.07.08 |
[백준][이분 탐색] - 2805. 나무 자르기 (0) | 2022.07.08 |