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

jun17114·2020년 12월 2일
0

[프로그래머스]

목록 보기
4/8
post-thumbnail

문제 설명

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

제한사항

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

입출력 예 설명

| prices | return |
|:---:|:---:|
| [1, 2, 3, 2, 3] | [4, 3, 1, 1, 0] |

** 입출력 예 #1 **

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

나의 풀이

def solution(prices):
    answer = [0] * len(prices)
    stack = []
    prices = list(zip(prices,list(range(0,len(prices)))))
    
    for v,n in prices:
        if len(stack)==0:
            stack.append(prices[n])
        else:
            while len(stack)>0:
                temp=stack.pop()
                if temp[0] <= v:
                    stack.append(temp)
                    stack.append(prices[n])
                    break
                else : 
                    answer[temp[1]]=n-temp[1]
                    if len(stack)==0:
                        stack.append(prices[n])

    for i in range(len(stack)):
        answer[stack[i][1]]=n-stack[i][1]
                    
    return answer

설명하기에 앞서 제 풀이는 너무 비효율적이고 길게 짠 것 같습니다.😥 그냥 이런 풀이도 있다 생각하고 보면 될 것 같습니다!

먼저 answer0으로 개수에 맞게 초기화 시켜줍니다. 그 후에는 문제를 해결하는데 사용될 빈 stack을 정의하고, prices0~len(prices)까지의 리스트와 priceszip() 함수를 사용하여 묶어줍니다.

[(1, 0), (2, 1), (3, 2), (2, 3), (3, 4)]

위와 같이 묶은 이유는 마지막에 몇초 동안 주식이 내려가지 않았는지 계산하기 위해서 각 주식가격이 등록된 시간을 함께 저장해 주었습니다.

for v,n in prices :에서 v는 Value n은 Number로 zip으로 묶인 튜플에서 각각의 요소를 꺼내옵니다.

for문에는 크게 두개의 분기로 스택이 비어있는지, 비어있지 않은지가 if문으로 나누게됩니다. 비어있으면 바로 stackpush하고 아니면 while문에 들어가게 됩니다. while문에서는 다음 들어올 주식 가격이 지금까지 들어있는 주식 가격과 같거나 빌때까지 stack에서 pop합니다.

마지막에 있는 for문은 prices의 마지막 index에서 stack에 남아있는 튜플의 n(number)값을 가져와 뺀 값을 answer[stack[i][0]]값에 넣어주게 됩니다.


0개의 댓글