초 단위로 기록된 주식가격이 담긴 배열 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]]
값에 넣어주게 됩니다.