coding/알고리즘,자료구조
프로그래머스 - 주식가격
Jeo
2022. 1. 21. 10:13
- 문제
그림 그리면서 생각해보기
import collections
def solution(prices):
# 준비물
# (1) 결과로 제출할 배열 answer "[ ] * N" (N = len(prices))
# (2) 인덱스와 가격을 함께 넣을 main_stack
# (3) 아직 비교를 기다리고 있는 '대기중인 가격들' (waiting_prices) >> queue
# 준비물 세팅
waiting_prices = collections.deque(prices)
main_stack = [[-1, 0]] # 첫 값이 stack 에 쌓일 때 비교를 위해 넣어 둔 값.
answer = [0] * (len(prices))
# 대기 중인 가격들에 대해서
for i, price in enumerate(waiting_prices):
while main_stack[-1][1] > price: # 만약 지금 메인 스택의 꼭대기(top)의 값보다, 지금 비교하는 가격이 작다면 계속해서.
top_idx = main_stack.pop()[0] # stack 꼭대기의 인덱스값과
days = i - top_idx # waiting prices 의 맨 앞에 서서 현재 비교 대상이었던 인덱스의 차이를 days 변수로 받아서
answer[top_idx] = days # 꼭대기에 있던 아이의 인덱스에 해당하는 answer 칸에 차이를 넣는다.
# main_stack.pop() # 그리고 나서 main stack 을 뽑아낸다.
# 메인 스택의 꼭대기(top)의 값보다, 지금 비교하는 가격이 크거나 같다면
main_stack.append([i, price])
# waiting_prices.popleft()
while len(main_stack) > 1: # 더 이상 비교해볼 가격은 없고, 메인 스택에 초기화해두었던 [-1, 0] 말고도 남아있다면.
top_idx = main_stack.pop()[0]
days = len(prices) - 1 - top_idx
answer[top_idx] = days
return answer