시간초과가 났다.
하긴 탑이 500,000개 있는데 사실상 포문 두번 돌린거라 이상할게 없긴했다..
length = int(input())
lines = list(map(int, input().split()))
stack = [lines[0]]
res = [0]
def findBiggerIdx(curHeight):
for i in range(len(stack) - 1, -1, -1): # 스택 역순 조회
if stack[i] >= curHeight:
return i + 1
return 0
for i in range(1, len(lines), 1): # 1번 인덱스부터 조회
cur = lines[i]
bigger = findBiggerIdx(cur)
res.append(bigger)
stack.append(cur)
print(*res, sep=" ")
우선 인터넷에서 구상하는 방법을 살펴보고, 천천히 구현해보니 해결되었다.
length = int(input())
lines = list(map(int, input().split()))
stack = []
res = []
for i in range(length):
while stack:
if stack[-1]['val'] < lines[i]:
stack.pop()
else:
res.append(stack[-1]['idx'] + 1)
stack.append({'idx': i, 'val': lines[i]})
break
if not stack:
stack.append({'idx': i, 'val': lines[i]})
res.append(0)
print(*res, sep=" ")
우선 인덱스 값과 탑의 높이를 담을 딕셔너리를 생각해야한다.
우리가 찾아야하는 값은 인덱스 + 1 이기 때문
쨌든 스택에는 의미있는 탑들만 들어간다.
위 방법으로 구현했다.