본문으로 바로가기

[프로그래머스] 주식가격

category ps/자료구조 2021. 12. 12. 15:41
Categoryps/자료구조
Tag자료구조
Tagsqueuestack
난이도level 2
발행 여부
사이트프로그래머스
실수 유형
이해완벽히 이해
최종 편집 일시
푼 날짜

문제 해설 및 주의사항

원문

문제 설명

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.

제한사항

  • prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
  • prices의 길이는 2 이상 100,000 이하입니다.

입출력 예

pricesreturn
[1, 2, 3, 2, 3][4, 3, 1, 1, 0]

입출력 예 설명

  • 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
  • 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
  • 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
  • 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
  • 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.

주의사항


풀이

pricesreturn
[1, 2, 3, 2, 3][4, 3, 1, 1, 0]
  • stack 을 이용해보자.
    • (top)[stack] 이 있다.
    • [1]
    • [2,1]
    • [3,2,1]
      • 2 가 stack 의 top 보다 작다.
      • 2 보다 작거나 같은 stack 의 top 이 나올때 까지 pop 해준다.
      • 답에는 변화를 일으킨 값의 index (3) 에서 원래 자신의 index (2) 를 빼준 값 1을 append 해준다.
    • [2,2,1]
    • [3,2,2,1]
      • 모든 값을 넣었다.
      • 남아있는 값은 모두 pop 하여 prices 의 전체 길이 - 1 - 자신의 index 를 append 해주자.

내 풀이 코드

import collections
def solution(prices):
    answer = [0 for _ in range(len(prices))]
    stack = collections.deque()
    
    for index, price in enumerate(prices) :
        while stack and stack[0][0] > price:
            current_top = stack.popleft()
            answer[current_top[1]] = index - current_top[1]
        
        # 가격(price) 뿐 아니라 index 까지 같이 넣어주는 이유는, 
				# 원래 `prices` 에서 어느 index 인지 빠르게 파악하기 위해서이다. 
				# 그래야만 위의 while 문에서 정답 처리를 할 때 O(1) 으로 처리할 수 있다.
        stack.appendleft((price, index))
    
    # 남은 값들 처리
    for price, index in stack:
        answer[index] = len(prices) - 1 - index
    
    return answer

퇴고

  • 다른 사람의 풀이를 봐도 내 풀이의 속도가 꽤 빠른 것을 알 수 있다.
  • stack 에 append 할 때, index 를 같이 넣어 정답 처리를 용이하게 한점
  • deque 를 사용하여 시간 복잡도를 줄인 점이 크게 작용하였다.
반응형