프로그래머스 - 주식가격 (스택/큐)
이번 포스팅에서는 프로그래머스의 주식가격(스택/큐) 코딩테스트 연습 문제를 풀어봅니다.
문제 설명
초 단위로 기록된 주식가격이 담긴 배열 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초간 가격이 떨어지지 않았습니다.
문제 풀이
prices 리스트의 비교 대상 값과 그 값을 제외한 나머지 값과의 순차적 비교가 필요해 보입니다.
큐 연산의 ‘get’ 연산처럼 첫번째 값을 대상이 되는 값으로 하고 리스트를 제외 합니다.
대상이 되는 값과 남은 값과의 비교를 통해 가격이 떨어지지 않으면 타임 카운트를 해주며 반복하고
리스트의 다음의 가격이 값이 떨어지면 타임 카운트를 늘려주고 반복문을 멈춥니다.
마지막으로 반복을 통해 얻은 대상 값의 타임 카운트를 리스트에 추가합니다.
코드는 아래와 같이 작성 하였습니다. 코드는 다르지 않는데 list의 pop(0)을 이용하니 프로그래머스에서 효율성 테스트에서 계속 통과가 안되더군요 ㅠㅠ. deque를 이용하여 prices 리스트를 한번 담아서 popleft()를 이용해 큐 연산의 ‘get’과 동일한 효과가 나게 하였습니다.
from collections import deque
def solution(prices):
answer = []
prices = deque(prices)
while prices:
tp = prices.popleft()
time = 0
for i in prices:
if tp > i:
time += 1
break
time += 1
answer.append(time)
return answer
def main():
print(solution([1,2,3,2,3]))
main()
[4, 3, 1, 1, 0]
결과는 아래와 같이 잘 통과 되는 것을 확인 할 수 있습니다.