[백준] 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)