[백준] 17298번. 오큰수 바로가기
아이디어
monotone stack
으로 스스로 푼 첫 문제 🤓
- 자신보다 큰 수 중에서 가장 가까이(왼쪽)에 있는 수를 찾는 것
- 수열을 거꾸로 뒤집어서 검사한다
- 첫 숫자는 비교 대상이 없기 때문에
stack
에 담는다
- 이후 현재 숫자와
stack
의 마지막(top
) 숫자를 비교해서 자신보다 클 때까지 pop
한다.
- 자신보다 큰 수가 나오면
result
에 그 수를 담고 현재 숫자를 stack
에 넣는다.
- 3-4를 반복한다.
- 자신보다 큰 수가 없으면
-1
을 담는다.
stack | 현재 숫자 | 수열 | 자신보다 큰 왼쪽수 |
---|
[] | 7 | [3, 5, 2] | -1 |
[7] | 2 | [3, 5] | 7 |
[7, 2] | 5 | [3] | 7 |
[7, 5] | 3 | [] | 5 |
시간 복잡도
코드
from collections import deque
import sys
input = sys.stdin.readline
n = int(input())
sequence = deque(map(int, input().split()))
stack = []
result = []
while sequence:
number = sequence.pop()
while stack and stack[-1] <= number:
stack.pop()
if stack:
result.append(stack[-1])
else:
result.append(-1)
stack.append(number)
result.reverse()
print(*result)
from collections import deque
import sys
input = sys.stdin.readline
n = int(input())
sequence = list(map(int, input().split()))
stack = []
result = []
for number in sequence[::-1]:
while stack and stack[-1] <= number:
stack.pop()
if stack:
result.append(stack[-1])
else:
result.append(-1)
stack.append(number)
result.reverse()
print(*result)