https://www.acmicpc.net/problem/17298
17298번: 오큰수
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.
www.acmicpc.net
| 1 초 | 512 MB | 82604 | 29446 | 20728 | 34.038% |
문제
크기가 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)을 공백으로 구분해 출력한다.

제출 코드
import sys
input = sys.stdin.readline
N = int(input())
nge = list(map(int, input().split()))
st = [0]
ans = [-1] * N
for i in range(1, N): # 오른쪽에 있는 큰 수들중 제일 왼쪽 고르기
while st and nge[st[-1]] < nge[i]:
ans[st.pop()] = nge[i]
st.append(i)
print(*ans)
for 반복문이 진행됨에 따라 여러번 반복된다면 O(n^2)의 시간 복잡도가 되겠지만, while문은 '총' n번 실행되는 것이기 때문에, for 반복문의 영향없이 실행된다고 한다. 그렇기 때문에 for-while문의 시간복잡도는 O(n)이다.
while문의 조건에 걸린다면, 이전에 넣었던 스택의 값(인덱스 값(i))을 ans의 인덱스 번호로 하여 nge(i)값을 넣어주는 방식.
ex ) nge(i) 와 nge(i+1)을 비교할 수 있다. (st[-1] == i)
제출 코드2 (시간초과)
import sys
from collections import deque
input = sys.stdin.readline
def big_right(i, num):
queue = deque()
for j in range(i+1, N+1): # 오른쪽에 있는 애들중 최대값 구하기
if num < nge[j]:
queue.append(nge[j])
if queue:
return queue.popleft()
else:
return -1
N = int(input())
nge = list(map(int, input().split())) + [0]
for i in range(N):
print(big_right(i, nge[i]), end=' ') # nge[i]로 비교
시간초과가 났던 코드.
'알고리즘 > 백준' 카테고리의 다른 글
| 0313. [BOJ#7983] 내일 할거야 (1) | 2024.03.13 |
|---|---|
| 0312. [BOJ#17478] 재귀함수가 뭔가요? (0) | 2024.03.12 |
| 0310. [BOJ#14502] 연구소 (3) | 2024.03.12 |
| 0309. [BOJ#16953] A → B (0) | 2024.03.10 |
| 0308. [BOJ#14501] 퇴사 (0) | 2024.03.09 |