개발계발/알고리즘

[17298] 오큰수 #python

냥냥친구 2020. 9. 21. 23:42

백준 17298번 오큰수

내가 푼 코드 ⇒ 시간초과

num = int(input())
a = list(map(int, input().split(" ")))
result = []
for i in range(num):
    if i+1 == num:
        result.append("-1")
        break
    max_num = max(a[i+1:])
    if a[i] < max_num:
        for j in range(i+1, num):
            if a[j] > a[i]:
                result.append(str(a[j]))
                break
    else:
        result.append("-1")
print(" ".join(result))

정답

num = int(input())
a = list(map(int, input().split(" ")))
result = ["-1" for _ in range(num)]
stack = []
stack.append(0)
i = 1
for i in range(num):
    while stack and a[stack[-1]] < a[i]:
        result[stack[-1]] = str(a[i])
        stack.pop()

    stack.append(i)
    i += 1

print(" ".join(result))

num의 최댓값이 백만이므로, 이중포문을 돌면 시간초과가 발생한다.

stack을 사용해서 해결하는데, 작은 수의 인덱스를 stack에 push 하다가 큰 수를 만나면 큰 수보다 작은 stack의작은 수를 모두 pop한다. 이런 식으로 push와 pop을 반복하며 바로 다음 큰 수를 찾는다.

'개발계발 > 알고리즘' 카테고리의 다른 글

[17729] 오등큰수 #python  (0) 2020.09.22
[Tip] 백준 시간 초과 에러  (0) 2020.09.21
[1406] 에디터 #python  (0) 2020.09.21
[11660] 구간 합 구하기5 #python  (0) 2020.09.21
[10866] 덱 #python  (0) 2020.09.21