17298번 - 오큰수

의혁·2025년 1월 30일
0

[Algorithm] 알고리즘

목록 보기
29/50

💡 리스트 초기화를 잘 이용하자!

import sys

input = sys.stdin.readline

N = int(input())
arr = list(map(int,input().split(' ')))
stack = []
ans = [-1] * N

for i in range(N):
    
    while stack:
        if arr[i] > arr[stack[-1]]:
            ans[stack.pop()] = arr[i]
        else:
            stack.append(i)
            break
        
    stack.append(i)

print(*ans)
  • 시간 제한이 1초이고, N의 최대값이 1,000,000 이였다. 따라서 for문을 1번만 사용할 수 있었고, 이 경우에는 스택을 사용하였다.
  • 풀이 법을 정리하자만 이와 같다.
    =>현재 값이 stack의 맨 위 값보다 크면, 현재 값보다 큰 수가 나올 때 까지, pop() 시키면서 arr[stack.pop()] 값에 현재 값을 넣어준다.
    => 현재 값이 stack의 맨 위 값보다 작으면, 그 값은 stack에 추가해준다.
  • 내가 생각하는 중요 포인트는 처음에 ans를 초기화할때, -1로 초기화하는 것이다.
    => 처음에는 위 방식을 진행하고 stack에 남은 index에 대한 ans[index] 값을 -1로 지정해주려고 했지만, 이 방식은 for문을 한번 더 써야했다.
    => 따라서 처음부터 초기화할때 -1로 초기화해준다면, stack의 남은 수를 처리하지 않아도 되기 때문에, 시간 복잡도 측면에서 이득이다!!
profile
매일매일 차근차근 나아가보는 개발일기

0개의 댓글