2024. 7. 4. 18:00ㆍ코딩테스트 고득점 Kit/스택/큐
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초간 가격이 떨어지지 않았습니다.
문제가 무슨 소리인지 도무지 이해를 못해서 찾아봤는데, 여러분도 여기서 보시는 걸 추천합니다.
https://school.programmers.co.kr/questions/20326?question=20326
간단히 말해서 해당 값이 얼마나 지나야 떨어지는가에 대한 문제입니다.
이것도 문제를 풀면서 이해가 안됐는데, 다 풀고 나니까 보이더라고요.
파이썬의 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문을 사용해서 감소하는 시점에 바로 끝내주었습니다.
프로그래머스가 문제를 이상하게 내서 어려운 문제였습니다.
'코딩테스트 고득점 Kit > 스택/큐' 카테고리의 다른 글
[스택/큐] 다리를 지나는 트럭 (0) | 2024.07.03 |
---|---|
[스택/큐] 프로세스 (1) | 2024.07.02 |
[스택/큐] 올바른 괄호 (0) | 2024.07.01 |
[스택/큐] 기능개발 (0) | 2024.06.30 |
[스택/큐] 같은 숫자는 싫어 (0) | 2024.06.29 |