[Python] 주식가격
도둑질
문제 설명
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.
제한사항
- prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
- prices의 길이는 2 이상 100,000 이하입니다.
입출력 예
- prices:
[1,2,3,2,3]
- return:
[4,3,1,1,0]
1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다. 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다. 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다. 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다. 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.
풀이
- 주식이 상승장일때의 정보를 알고 있다가 스택에 저장.
- 시간이 지나감에 따라 주식이 하락장이 왔을 때, 상승장때 샀던 정보들을 스택에서 꺼내서 현재 가격보다 비싸면 스택에서 제거
- 상승장일때의 정보는 항상 상승장일때만 등록되기 때문에 자연스럽게 오름차순으로 정렬됨. 매번 모든 가격을 비교하지 않고 스택의 마지막 가격만 비교하면 되기 때문에 시간 복잡도 N으로 해결 가능함.
def solution(prices):
queue = [[0, prices[0]]]
answer = [0] * len(prices)
for i in range(1, len(prices)):
for pos, price in queue:
answer[pos] += 1
while queue and queue[-1][1] > prices[i]: # 하락했을 때, 스택의 맨 끝 가격과 비교. 하락한 가격이 맨 끝 가격보다 싸면 제거.
queue.pop()
queue.append([i, prices[i]])
return answer