CodingTest

주식가격

흑조롱이 2024. 5. 6. 07:19

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

 

프로그래머스

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

programmers.co.kr

 

I. 개요

스택을 이용하여 가격이 언제 떨어졌는 지 계산하는 문제이다.

 

가격이 떨어지지 않으면 스택에 넣고, 떨어지는 시점에서 스택을 비워주면 된다.

 

 

II. 알고리즘 설계

마주할 수 있는 경우에는 실제로 떨어지거나, 한번도 떨어지지 않는 2가지 경우가 있다.

 

따라서 위 2가지의 경우를 모두 고려해야 한다.

 

1. 실제로 떨어지는 경우

스택에는 이전에 본 가격의 index들을 넣어둔다.

 

현재 보고있는 가격이 직전에 본 가격보다 작으면, 가격이 떨어지지 않은 기간을 구하고, 상승하는 과정에서 스택에 넣은 index들을 전부 빼준다.

 

가격 대신 index를 스택에 넣음으로써, 가격이 떨어지지 않은 시간을 쉽게 구할 수 있다.

 

그게 아니라면, 현재의 index를 스택에 넣어준다.

 

2. 한번도 떨어지지 않는 경우

i번째 주식이 떨어지지 않은 기간은 주어진 prices의 길이에서, i+1 만큼 뺀 값이다.

 

위의 방식으로 기간을 구하여, 답안에 반영한다.

 

 

III. 문제 풀이

1. 변수 초기화

n = len(prices)
ans = [0 for _ in range(n)]
stk = []

 

답안을 저장하기 위한 list와 스택을 만들어준다.

 

ans[i]는 i번째 가격이 떨어지지 않은 시간을 나타낸다.

 

2. 가격이 떨어질 때 까지의 시간 구하기

for i in range(n):
    while stk and prices[stk[-1]] > prices[i]:
        post = stk.pop()
        ans[post] = i - post
    else:
        stk.append(i)

 

지금 보고있는 가격보다, 이전에 본 가격이 더 높다면, 스택의 맨 위에 있는 값을 빼온다.

 

여기서 빼온 값은 가격이 내려가지 않은 시점이다.

 

이를 현재 시점(i) 에서 빼주면, 가격이 내려가지 않은 시간을 구할 수 있다.

 

가격이 내려가지 않았다면, 스택에 넣어준다.

 

 

3. 가격이 한번도 떨어지지 않은 경우

for i in stk:
    ans[i] = n - i - 1

return ans

 

스택에 남아있는 값(i)들은 한번도 가격이 내려간 적이 없다.

 

이 경우 가격이 내려가지 않은 시간은 전체 시간(n) 에서, 가격을 본 시각(i) 만큼 빼줘야 한다.

 

여기서 1을 한번더 빼주지 않으면, 정답보다 값이 1만큼 늘어나 오답으로 처리된다.

 

IV. 전체 코드

def solution(prices):
	# 1. 변수 초기화
    n = len(prices)
    ans = [0 for _ in range(n)]
    stk = []
    
    # 2. 가격이 떨어질 때 까지의 시간 구하기
    for i in range(n):
        while stk and prices[stk[-1]] > prices[i]:
            post = stk.pop()
            ans[post] = i - post
        else:
            stk.append(i)
    
    # 3. 가격이 한번도 떨어지지 않은 경우
    for i in stk:
        ans[i] = n - i - 1
    
    return ans

 

 

V. 제출 결과