
문제 링크: https://www.acmicpc.net/problem/17298
이 문제는 각 원소의 오큰수 NGE(i) 를 구하는 문제다.
오큰수가 없으면 -1을 출력한다.
오큰수 NGE(i):
i의 오른쪽에 있으면서A[i]보다 큰 수들 중 가장 왼쪽에 있는 수.
예제로 감 잡아보자.
[3, 5, 2, 7]어떤 자료구조를 쓰면 좋을까?
NGE(i)는 “오른쪽에서 나보다 큰 수를 가장 먼저 만나는 지점”을 찾는 것.val보다 큰 첫 원소를 찾으려 하면O(N^2)가 된다.처음엔 큐로 이렇게 시도해봤다(아이디어는 맞지만 구현·복잡도 이슈로 부적절):
import sys
from collections import deque
input = sys.stdin.readline
N = int(input())
q = deque(map(int, input().strip().split()))
NGE = []
for i in range(N):
val = q[i]
# q에서 popleft() 하며 val보다 큰 값을 찾으면 append하고 break,
# 끝까지 못 찾으면 -1 추가… 라는 접근
while q:
cur = q.popleft()
if cur > val:
NGE.append(cur)
break
else:
NGE.append(-1)
print(*NGE)
왜 문제였나?
popleft() 할 때마다 원본 q가 계속 바뀜 → 인덱싱/로직 꼬임.O(N^2) → 시간초과.핵심은 “아직 오큰수를 못 찾은 인덱스들” 을 스택에 들고 가는 것.
pop하고 결과에 기록.import sys
input = sys.stdin.readline
N = int(input())
A = list(map(int, input().split()))
NGE = [-1] * N
stack = [] # 아직 오큰수를 못 찾은 인덱스들을 저장
for i in range(N):
# 현재 값으로 스택 상단(이전 인덱스들)의 오큰수를 해결할 수 있는 동안 pop
while stack and A[stack[-1]] < A[i]:
idx = stack.pop()
NGE[idx] = A[i]
# 현재 인덱스는 아직 오큰수 미정 → 스택에 보류
stack.append(i)
print(*NGE)
A = [1, 2, 2, 2, 3] 으로 따라가 보자.
초기:
A = [1, 2, 2, 2, 3]
NGE = [-1, -1, -1, -1, -1]
stack = []
stack = [0]
NGE = [-1, -1, -1, -1, -1]
NGE[0] = 2stack = [1]
NGE = [2, -1, -1, -1, -1]
stack = [1, 2]
NGE = [2, -1, -1, -1, -1]
stack = [1, 2, 3]
NGE = [2, -1, -1, -1, -1]
NGE[3] = 3, pop 3NGE[2] = 3, pop 2NGE[1] = 3, pop 1stack = [4]
NGE = [2, 3, 3, 3, -1]
끝. 스택에 남은 4(값 3)는 끝까지 오큰수 없음 → -1 유지.
최종 NGE = [2, 3, 3, 3, -1]
O(N^2)이라 시간초과.O(N)에 끝난다.스택에 무얼 저장하고, 어떨 때 pop을 하며 풀 수 있을지
다시 한번 잘 생각해봐야겠다.