백준2493탑

개발일지.·2022년 3월 31일

처음에 우직하게 O(n**2)로 맛있게 먹을려고 했으나
시간초과로 인해 제출을 못했다

n = int(input())
arr = list(map(int,input().split()))
answer = [0]
for i in range(1,len(arr)):
    k=True
    for j in range(i-1,-1,-1):
        if arr[i]<=arr[j]:
            answer.append(j+1)
            k=False
            break
        else:continue
    if k :
        answer.append(0)
print (" ".join(map(str,answer)))

그래서 스택을 사용해서 풀었다
왼쪽, 즉 현재 있는 요소보다 큰 값을 가진 전의 요소 중 제일 최근요소를 가져오는게 포인트였는데 스택을 통해서 구현했다
스택에 제일 최상단의 요소부터 지금 요소와 비교해서 큰 값이 있으면 answer에 번호를 추가하고 아니면 스택을 pop시켜서 해결했다.
그리고 while문을 나오면서 스택에 현재 요소를 넣어서 최신화를 했고 stack이 비어있을 때 아무것도 통과하지 못한 것이므로 answer에 0을 추가했다.

n= int(input())
arr = list(map(int,input().split()))
stack=[]
answer=[]
for i in range(len(arr)):
    while stack:
        if stack[-1][1]>arr[i]:
            answer.append(stack[-1][0]+1)
            break
        else :
            stack.pop()
    if len(stack)==0:
        answer.append(0)
    stack.append([i,arr[i]])

print (" ".join(map(str,answer)))
profile
もう少し高く、もっと深く

0개의 댓글