초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.
제한사항
| prices | return |
|---|---|
| [1, 2, 3, 2, 3] | [4, 3, 1, 1, 0] |
입출력 예 #1
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
설명하기에 앞서 제 풀이는 너무 비효율적이고 길게 짠 것 같습니다.😥 그냥 이런 풀이도 있다 생각하고 보면 될 것 같습니다!
먼저 answer을 0으로 개수에 맞게 초기화 시켜줍니다. 그 후에는 문제를 해결하는데 사용될 빈 stack을 정의하고, prices를 0~len(prices)까지의 리스트와 prices를 zip() 함수를 사용하여 묶어줍니다.
[(1, 0), (2, 1), (3, 2), (2, 3), (3, 4)]
위와 같이 묶은 이유는 마지막에 몇초 동안 주식이 내려가지 않았는지 계산하기 위해서 각 주식가격이 등록된 시간을 함께 저장해 주었습니다.
for v,n in prices :에서 v는 Value n은 Number로 zip으로 묶인 튜플에서 각각의 요소를 꺼내옵니다.
for문에는 크게 두개의 분기로 스택이 비어있는지, 비어있지 않은지가 if문으로 나누게됩니다. 비어있으면 바로 stack에 push하고 아니면 while문에 들어가게 됩니다. while문에서는 다음 들어올 주식 가격이 지금까지 들어있는 주식 가격과 같거나 빌때까지 stack에서 pop합니다.
마지막에 있는 for문은 prices의 마지막 index에서 stack에 남아있는 튜플의 n(number)값을 가져와 뺀 값을 answer[stack[i][0]]값에 넣어주게 됩니다.