프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42584#
[나의 풀이]
⌛ 18분
from collections import deque
def solution(prices):
answer = []
prices = deque(prices)
.
while prices:
price = prices.popleft()
tmp_prices = prices
cnt = 0
for tmp_price in tmp_prices:
cnt += 1
if price>tmp_price:
break
answer.append(cnt)
return answer
입력된 주식 가격 배열이 주어지고, 각 시간별(인덱스) 주식가격이 떨어질 때까지의 초를 구하는 문제입니다.
queue 구조를 활용하여 시간대별로 돌고, 그 뒤 for문을 활용하여 각 시간대별 주식 하락까지의 시간을 구하였습니다.
[다른 사람의 풀이1]
def solution(prices):
stack = []
answer = [0] * len(prices)
for i in range(len(prices)):
while stack != [] and stack[-1][1] > prices[i]:
past, _ = stack.pop()
answer[past] = i - past
stack.append([i, prices[i]])
for i, s in stack:
answer[i] = len(prices) - 1 - i
return answer
stack을 활용한 풀이입니다. 각 시간대를 돌며 현재 주식가격이 이전 주식 가격보다 올랐다면 넘어가고 그것이 아닐 때에는 이전 주식 가격과 비교하며 주식 하락까지의 시간을 구하는 방식이였습니다.
포인트는 각 시간대별로 돌며 [인덱스,값]을 stack에 누적시키며 하락할 때 stack.pop()하여 판단했다는 점입니다.
이때, 주식이 한번도 하락하지 않는 시간대의 가격이 있다면 주식 하락까지의 시간은 입력된 배열의 길이에 비례하므로 길이-인덱스로 표현해준 것을 볼 수 있었습니다.
[다른 사람의 풀이2]
def solution(prices):
length = len(prices)
# answer을 max값으로 초기화
answer = [ i for i in range (length - 1, -1, -1)]
# 주식 가격이 떨어질 경우 찾기
stack = [0]
for i in range (1, length):
while stack and prices[stack[-1]] > prices[i]:
j = stack.pop()
answer[j] = i - j
stack.append(i)
return answer
'다른 사람의 풀이1'과 유사하되 answer을 max값으로 초기화한 점이 다른 풀이이입니다.
이 경우에도 주식 가격이 떨어질 때에만, 이전 주식 가격들과 비교하여 주식 하락까지의 시간으로 바꾸어주고
이외에 주식 가격이 떨어지지 않는 시간대에는 처음 초기화한 그대로 최댓값으로 적용되는 것을 볼 수 있었습니다.
감사합니다.