프로그래머스에서 뒤의 큰 수를 찾는 문제를 푸는데,
단조 스택에 관해 잘 설명된 한국어 문서가 없어서 정리 한다.
오름차순 또는 내림차순으로 수가 배열되어 있는 스택을 단조 스택이라고 하며, 천장으로 갈수록 수가 작아지는 스택을 단조감소스택, 반대의 경우를 단조증가스택이라고 한다.
단조 감소 스택 예시
단조 증가 스택 예시
단조 감소 스택을 사용하여 뒤에 있는 가장 가까운 큰 수를 찾을 수 있다.
원리는 다음과 같다.
다음 단조 감소 스택의 내용을 바탕으로 다음 문제를 풀이해보도록 하자.
https://school.programmers.co.kr/learn/courses/30/lessons/154539
def solution(numbers):
answer = []
for index, number in enumerate(numbers):
is_bigger = False
for i in range(index+1, len(numbers)):
if number < numbers[i]:
answer.append(numbers[i])
is_bigger = True
break
if not is_bigger:
answer.append(-1)
return answer
현재 순회중인 배열 값과 그 이후의 배열을 모두 비교하여 정확하게 값을 구할 수 있다.
그러나, for 문을 2번 순회하기에 시간 복잡도는 n^2이 된다.
def solution(numbers):
answer = [-1] * len(numbers)
stack = []
for index, number in enumerate(numbers):
while stack and numbers[stack[-1]] < number:
answer[stack.pop()] = number
stack.append(index)
return answer
다음과 같이 풀이를 함으로써 시간 복잡도를 n으로 대폭 줄일 수 있다.