백준17298(파이썬) - 오큰수

resilient

·

2021. 5. 18. 00:50

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

  • 먼저 이문제는 탐색이 필요하지만 시간초과가 걸리기 때문에 반복문을 여러번 쓸 수 없다.
  • 그래서 스택을 사용했다. 
  • 그래서 생각한건 인덱스를 저장해놓고 빼고 저장해놓고 빼고를 반복하면서 현재의 숫자와 비교하는 것이다.
  • 카운트 변수를 1로 초기화 해주고, while 문에서 1씩 더해주면서, 오큰수의 인덱스를 찾아주고,
  • 스택함수중에서 pop()을 사용하기 때문에, 스택 인덱스 또한, 0번째 인덱스가 아닌 -1번째 인덱스를 현재 비교하는 숫자로 두고,  인덱스가 카운트 변수 cnt 번째인 주어지는 리스트에서 꺼냈다. 현재 비교하는 숫자가 오큰수가 아니면 인덱스를 앞쪽으로 미뤄둔다. 
import sys
input = sys.stdin.readline

n = int(input())
data = list(map(int,input().split()))
stack = [0]
ans = [-1 for _ in range(n)] # 오큰수 없으면 -1
cnt = 1
while cnt<n:
    while stack and data[stack[-1]] < data[cnt]:
        ans[stack[-1]] = data[cnt]
        stack.pop()
    stack.append(cnt)
    cnt+=1

for i in ans:
    print(i,end=' ')
반응형