[알고리즘] 프로그래머스 - 주식가격

da__ell·2023년 3월 27일
0

DataStructure / ALGORITHM

목록 보기
18/23
post-thumbnail

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42584

문제 설명
초 단위로 기록된 주식가격이 담긴 배열 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은 끝까지 가격이 떨어지지 않았습니다.
2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.

풀이 해설

def solution(prices):
    answer = [i for i in range(len(prices)-1, -1, -1)]
    stack = [0]
    for i in range(1, len(prices)):
        while stack and prices[stack[-1]] > prices[i]:
            idx = stack.pop()
            answer[idx] = i-idx
        stack.append(i)
    return answer

answer = [i for i in range(len(prices)-1, -1, -1)]

우선 answer은 가격이 떨어지지 않은 기간을 저장하는 리스트이다. prices 리스트를 뒤에서부터 탐색하면서, 해당 시점에서 가격이 떨어지지 않은 기간을 answer 리스트에 업데이트 한다.

stack = [0]

stack은 현재까지 가격이 떨어지지 않은 기간을 저장하는 스택이다. stack의 top 원소는 가장 최근에 기록한 가격이 가장 낮은 것이다.


for i in range(1, len(prices)):
        while stack and prices[stack[-1]] > prices[i]:
            idx = stack.pop()
            answer[idx] = i-idx
        stack.append(i)

for 문에서 prices 리스트를 앞에서부터 탐색하면서, 가격이 떨어지는 시점에서 stack에서 top원소를 pop해서 그 시점의 가격이 떨어지는 시점의 가격보다 작을 때까지 반복문을 실행한다.
이 과정에서 pop한 top원소에 해당하는 answer 리스트의 값을 i(현재 시점) - idx(떨어지는 시점)으로 업데이트 한다.


stack.append(i)

이후 가격이 떨어지지 않은 시점인 i를 스택에 추가한다. 이를 모든 prices 리스트의 원소에 대해 반복하면, 각격이 떨어지지 않은 기간을 모두 계산할 수 있다.

profile
daelkdev@gmail.com

0개의 댓글