Cometin'

BOJ-17298 - Python

2020-08-10 at Algorithm category

위 문제의 시간초과로 인하여 스택을 이용하여 풀어 보았다. range(n-1)을 반복하며 s[i]보다 s[i+1]이 클 떄 정답 리스트인 ans_l에 [i]에 넣었다. 그렇지 못할 때 스택에 push하는데 스택에는 s[i]를 저장하는 list와 i를 저장하는 init_len 리스트를 두어 반복문 수행안에 while 스택의 길이가 0보다 크며 s[i+1]이 스택의 맨 마지막에 들어온 것보다 클 때 ans_l에 추가하여 풀었다. 다른 사람의 풀이를 보니 아직 배울 점이 많은 걸 또 깨달았다.

# n = int(input())
# l = list(map(int, input().split()))
# for i in range(n):
#     for j in range(i, n):
#         if l[j] > l[i]:
#             print(l[j], end=' ')
#             break
#         elif j == n-1:
#             print(-1, end=' ')

class Stk:
    def __init__(self):
        self.list = []
        self.len = 0
        self.init_len = []
    def push(self, n, i):
        self.list.append(n)
        self.len += 1
        self.init_len.append(i)
    def top(self):
        return self.list[-1]
    def del_top(self):
        self.list.pop(-1)
        self.len -= 1
        self.init_len.pop(-1)

n = int(input())
s = list(map(int, input().split()))
ans_l = [-1] * n
stk = Stk()
for i in range(n-1):

    while stk.len > 0 and s[i+1] > stk.top():
        ans_l[stk.init_len[-1]] = s[i+1]
        stk.del_top()
    if s[i] < s[i+1]:
        ans_l[i] = s[i+1]
    else:
        stk.push(s[i], i)

print(*ans_l, end=' ')

# n=int(input())
# a=[*map(int,input().split())]
# s=[]; nge=[-1]*n
# for i in range(n):
#   while s and a[s[-1]]<a[i]:
#     nge[s.pop()]=a[i]
#   s.append(i)
# print(*nge)

hyesungoh

Personal blog by hyesungoh.

I like to share my knowledge for those who wandering in issue.