스택으로 풀 수 있는 문제의 한 종류인 것 같아서 따로 정리한다.
answer
배열을 [0, 0, 0, ...]
으로, stack
은 빈 리스트로 initialize한다. arr
이라 하자)을 순서대로 순회하면서 "stack
의 head에 있는 값"보다 "arr
에서 보고 있는 값"이 더 작거나 같으면 stack에 push한다.stack
의 head에 해당하는 값이 더 크다면 그 값을 pop한다. 이후 그 값에 해당하는 위치에 answer
를 업데이트한다.글로 쓰니 더 헷갈리는 듯....코드는 의외로 간단하다.
import sys
def main():
input = sys.stdin.readline
N = int(input())
arr = list(map(int, input().split()))
answer = [0] * N
stack = []
for i in range(N):
num = arr[i]
while stack and arr[stack[-1]] < num:
answer[stack.pop()] = num
stack.append(i)
for j in stack:
answer[j] = -1
print(*answer)
if __name__ == "__main__":
main()
이 문제의 핵심은 stack
배열의 특징이다. 어떠한 경우에도 stack
은 내림차순의 순서를 지키게 된다. 따라서 하나의 while문 안에서 순서대로 pop하면서 보는 것이 가능하다. 지금 pop하는 값은 이전에 pop하는 값보다 작거나 같았을 것이므로!!