https://www.acmicpc.net/problem/17298
크기가 N인 수열 A = A1, A2, ..., AN이 있다. 수열의 각 원소 Ai에 대해서 오큰수 NGE(i)를 구하려고 한다. Ai의 오큰수는 오른쪽에 있으면서 Ai보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오큰수는 -1이다.
예를 들어, A = [3, 5, 2, 7]인 경우 NGE(1) = 5, NGE(2) = 7, NGE(3) = 7, NGE(4) = -1이다. A = [9, 5, 4, 8]인 경우에는 NGE(1) = -1, NGE(2) = 8, NGE(3) = 8, NGE(4) = -1이다.
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다.
둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.
출력
총 N개의 수 NGE(1), NGE(2), ..., NGE(N)을 공백으로 구분해 출력한다.
예제 입력
4
3 5 2 7
예제 출력
5 7 7 -1
해결 방법
- 오큰수를 인덱스로 확인한다.
- 오큰수가 아니면 오큰수 리스트에 오큰수가 아닌 인덱스를 입력받는다.
- 비교한 수가 오큰수이면 해당 값을 팝하고 그 자리에 오큰수를 입력한다.
import sys
input = sys.stdin.readline
N = int(input())
arr = list(map(int, input().split()))
result = [-1] * N
stack = [0] # 오큰수를 0번째 인덱스부터 확인한다.
for i in range(1, N):
# 오큰수가 있는지 확인
while stack and arr[stack[-1]] < arr[i]:
# 오큰수이면 비교한 값을 pop하고 오큰수를 입력 받는다.
# 위 과정을 오큰수 리스트가 사라질 때까지 한다.
result[stack.pop()] = arr[i]
# 오큰수를 비교할 인덱스 추가
stack.append(i)
print(*result)
맞았습니다!
'알고리즘' 카테고리의 다른 글
[BOJ / Python] 10819 차이를 최대로 (0) | 2023.01.03 |
---|---|
2. 완전 탐색 (0) | 2023.01.03 |
1. 자료 구조 (0) | 2022.12.26 |
[알고리즘] BinarySearch # lowerBound / upperBound (0) | 2022.01.26 |
[BOJ][Java] 1181 단어 정렬 (0) | 2022.01.25 |