[스택/큐] 주식가격

2024. 7. 4. 18:00코딩테스트 고득점 Kit/스택/큐

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

 

프로그래머스

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

programmers.co.kr


문제 설명
초 단위로 기록된 주식가격이 담긴 배열 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초간 가격이 떨어지지 않았습니다.

문제가 무슨 소리인지 도무지 이해를 못해서 찾아봤는데, 여러분도 여기서 보시는 걸 추천합니다.

https://school.programmers.co.kr/questions/20326?question=20326

 

프로그래머스

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

programmers.co.kr

간단히 말해서 해당 값이 얼마나 지나야 떨어지는가에 대한 문제입니다.

이것도 문제를 풀면서 이해가 안됐는데, 다 풀고 나니까 보이더라고요.

파이썬의 deque를 사용해서 코드와 함께 설명하겠습니다.

# deque 패키지를 임포트합니다.
from collections import deque

def solution(prices):
    # 시간을 저장할 answer
    answer = []
    # 가격을 저장한 dq
    dq = deque(prices)
    
    # dq에 값이 남아있다면
    while(dq):
        # 해당 주식의 유지시간 초기화
        time = 0
        # 현재 주식을 왼쪽에서 꺼낸다
        current_price = dq.popleft()
        
        # 시간마다 주식 가격을 분석한다
        for price in dq:
            # 시간은 항상 1 증가
            time += 1
            # 만약 현재 가격보다 떨어졌다면 종료
            if current_price > price:
                break
        # 시간을 answer에 추가
        answer.append(time)
    return answer

새로운 예시로 설명해보겠습니다.

[3, 2, 2, 3, 1]이라는 주식 변동값이 있습니다.

 

$3은 2초에 $2로 감소합니다. 따라서 1초간만 가격을 유지했습니다.

$2는 3초 $2, 4초 $3으로 가격을 유지하다가, 5초 $1으로 감소합니다. 따라서 3초간 가격을 유지했습니다.

$2는 4초 $3으로 가격을 유지하다가, 5초 $1으로 감소합니다. 따라서 2초간 가격을 유지했습니다.

$3은 5초에 $1로 감소합니다. 따라서 1초간만 가격을 유지했습니다.

$1은 뒤의 값이 없으므로 0초간 가격을 유지했습니다.

 

따라서 현재 값을 큐에서 뽑아내고, 또 남은 값들을 큐 안에서 비교해야 됩니다.

저는 deque 구조의 popleft()로 현재 값을 뽑아냈고, for 반복문을 사용해서 남은 값들과의 비교를 진행했습니다.

이 문제에서는 감소 이후에는 아무런 측정이 없기 때문에, break문을 사용해서 감소하는 시점에 바로 끝내주었습니다.

 

프로그래머스가 문제를 이상하게 내서 어려운 문제였습니다.