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
<복습 체크>
22/02/18 | |||||||||
O |
<내 코드>
- n이 최대 100만이기 때문에 시간복잡도가 n^2이면 시간초과가 발생한다.
- 따라서 최대한 n에 가깝게 코드를 구현해야한다.
- for문으로 입력받은 데이터의 모든 원소를 탐색한다.
- 이때 stack에 원소가 있고, 스택의 마지막 원소보다 해당 데이터의 크기가 클때 while문 수행
- 스택의 원소를 pop하고, result 배열에 값을 넣어준다.
- 매번 스택에 값을 차례대로 추가한다.
n = int(input())
data = list(map(int, input().split()))
result = [-1]*n #결과 배열 -1로 초기화
stack = []
for i in range(n):
while stack and stack[-1][0]<data[i]:
temp, idx = stack.pop()
result[idx] = data[i]
stack.append([data[i], i])
print(*result)
<시간 초과 코드>
- 매번 스택 문제에서 나는 아래 방식처럼 해서 틀린다,,,
- 저 방식은 최악의 경우 n(n-1)의 시간복잡도가 나오므로 100만을 제곱하고,, 100만을 빼봐야,,, 시간초과 ㅎ
from collections import deque
import sys
input = sys.stdin.readline
n = int(input())
nums = list(map(int, input().split()))
queue = deque(nums)#큐로 변경
result = []
while queue:
pop = queue.popleft()
if len(queue)>0:
check = 0
for i in range(len(queue)):
check+=1
if pop < queue[i]:
result.append(queue[i])
break
if check == len(queue):
result.append(-1)
result.append(-1)#마지막 원소 처리
for r in result:
print(r, end = ' ')
'알고리즘 > 스택, 큐' 카테고리의 다른 글
[백준-실버3] 1874번 스택 수열(스택, 파이썬) (0) | 2022.02.17 |
---|---|
[백준 -실버4] 18258번 큐 2(큐, 파이썬) (0) | 2022.02.04 |
[백준 -골드5] 6198번 옥상 정원 꾸미기(스택, 파이썬) (0) | 2022.01.23 |
[백준 -골드5] 2493번 탑(스택, 파이썬) (0) | 2022.01.22 |
[백준 -실버3] 1406번 에디터(스택, 파이썬) (0) | 2022.01.22 |