프로그래머스/Lv.2

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

MINU.SHINNNN 2024. 8. 11. 19:59

https://school.programmers.co.kr/learn/courses/30/lessons/42584?language=python3#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

초 단위로 기록된 주식 가격이 주어질 때, 가격이 떨어지지 않은 기간이 몇초인지 리턴해야 하는 문제입니다.

 

스택에 값을 기록한뒤 새로운 값이 들어오면, 이전에 기록한 값이 새로운 값 보다 크다면 계속해서 pop해주는 방법으로 문제를 해결할 수 있습니다.

이 때, pop 하는 값은 몇초간 스택에 남아있었는지 answer에 기록해둡니다.

 

값을 검사하고 stk에 남아있는 값들에 대해 해당 인덱스가 stk에 몇초간 남아있었는지 채워줍니다.

이 때, stk에 머무른 시간은 len(prices) - 1 - 주식의 인덱스 입니다.

 

참고

 pop하는 부분을 while문으로 처리하지 않으면 이전에 넣은 값에 대해서는 처리할 수 없음에 주의가 필요합니다.

예를 들어,

[3, 3, 2, 2, 2] 의 경우 [2, 1, 2, 1, 0]이 정답이나, 한번만 처리하는 로직으로 짠다면 [4, 1, 2, 1, 0] 이라는 값이 나오게 됩니다. 

def solution(prices):
    answer = [0 for _ in prices]
    stk = []
    for idx, v in enumerate(prices):
        if idx == 0:
            stk.append([idx, v])
        else:
            # 가격이 떨어진 경우, 지금까지 넣어둔 모든 값을 비교해야함
            while stk and stk[-1][1] > v:
                answer[stk[-1][0]] = idx - stk[-1][0]
                stk.pop()
            
            stk.append([idx, v])
            
    # 아직 인덱스가 없는 시점 채우기
    for v in stk:
        answer[v[0]] = len(prices) - 1 - v[0]
        
    return answer