백준

백준 2493 탑 (파이썬)

MC류짱 2022. 11. 14. 17:08

풀이 및 해설(주석)

import sys

N = int(sys.stdin.readline())

arr = list(map(int, sys.stdin.readline().strip().split()))

S = []
# 결과 값을 담을 리스트
rst = []

# 아무 조건에 충족하지 않으면 rst에 0을 추가 (왼쪽에 나보다 큰놈이 없는 경우)
# 그리고 그 인덱스와 높이를 S에 추가
for i in range(N):
    pointer = 0
    hei = arr[i]
    # S에 추가된 놈들 중 나보다 작은놈은 pop해버리기
    while S and S[-1][0] < arr[i]:
        S.pop()
    # 위의 과정을 거쳤는데 S에 뭐가 남아있으면 그게 내 왼쪽에서 나보다 큰놈의 정보임
    if S:
        pointer = S[-1][1] + 1

    rst.append(pointer)
    S.append([hei, i])

print(*rst)

 

.


후기

  • 실행 시간 1초 나왔는데 아마 이거보다 효율적이게 푸는 법이 있을 듯
  • 스택에 append하는 과정에서 조건을 줄 수 있겠지만 pass하겠습니다..