Coding Test/Baekjoon

[Python] 파이썬 백준(17298) 오큰수

파송송 2023. 7. 14. 22:42
728x90

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



스택 문제 이긴 하지만 어떻게 풀어도 O(n^2)의 시간복잡도가 나올 거라는 생각에 for문을 2개 사용해서 문제를 해결하고자 했다..!

import sys
input = sys.stdin.readline

n = int(input())
nge_list = list(map(int, input().split()))
answer = []

for i in range(n):
    for j in range(i,n):
        if j == n-1 and nge_list[i] >= nge_list [j]:
            answer.append(-1)

        if nge_list[i] < nge_list [j]:
            answer.append(nge_list [j])
            break

answer = map(str, answer)
print(' '.join(answer))

역시,,, 안될거 같았지만 도전하는 정신이 중요하다고 생각한다. 어쨌든 시간 초과가 떴다.

stack을 통해 접근하기로 하고 아래와 같이 구조를 작성했다.


i번째 원소는 그 바로 다음 수 보다 크기 때문에 s에 들어가게 된다.

 

그다음 i+1와 i+2를 비교할 때 i+1보다 i+2가 작다면 i보다도 당연히 작게 된다.

i+1보다 i+2가 크다면 i+1 자리에 i+2를 넣고 i와 비교한다 (stack 사용)

 

위와 같은 방법을 따르면 for문을 2번 돌지 않아도 되기에 시간이 빠르다.

import sys
input = sys.stdin.readline

n = int(input())
A = list(map(int, input().split()))
answer = [-1]*n
stack = [0]

for i in range(1,n):
    while stack and A[stack[-1]] < A[i]:
        answer[stack.pop()] = A[i]
    stack.append(i)

print(*answer)

728x90