문제
문제 설명
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.
제한사항
- prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
- prices의 길이는 2 이상 100,000 이하입니다.
코드
from collections import deque
def solution(prices):
prices = deque(prices) #deque 형식으로 변환
answer = []
while prices:
cur_time = 0 #0초부터 시작
cur_price = prices.popleft() #가장 앞에 있는 price = 현재 price
for price in prices:
#다음 price가 현재 price보다 크거나 같으면 떨어지지 않은 것이므로 time += 1
if cur_price <= price:
cur_time += 1
#떨어졌다면 1초 경과 후 떨어진 것이므로 time += 1이후 break
else:
cur_time += 1
break
answer.append(cur_time)
return answer
진행 과정
예제 #1
prices = [1, 2, 3, 2, 3]
처음에 헷갈리는 부분이 있었다. 가격이 떨어지지않으면 1초 증가하고 가격이 떨어졌는데 1초 경과 후 떨어진 것이라고 하니 이게 무슨 말인가하고 고민을 조금 했던 것 같다.
우선 떨어지지 않았을때만을 생각하고 코드를 구현하면 이렇다.
while prices:
cur_time = 0
cur_price = prices.popleft()
for price in prices:
if cur_price <= price:
cur_time += 1
위에서 코드 작성된 것이랑 별로 큰 차이는 없다. 단지 가격이 떨어졌을때를 추가로 생각하여 구현한 것이다.
떨어졌을때는 1초 경과 후 떨어지는 것이라고 한다. 왜냐하면 현재 시점부터 다음 시점까지 1초의 간격이 있기 때문이다. 이 간격동안은 떨어지지않은 것이기 때문에 1초 경과 후 떨어지는 것이라고 보는 것 같다.
마지막 price는 더 이상 떨어지지도 올라가지도 않으므로 0초가 경과했다고 본다.
여기서 코드 작성된 것을 보면 "for price in prices"에서 마지막 price가 cur_price로 진행됬을때 아무 것도 없으므로 cur_time은 0이 된다. 즉, 떨어지는 경우까지만 생각해도 이미 문제가 풀렸다는 것이다.
코드 진행은 다음과 같다.
1) cur_price = 1
2) cur_time = 0
3) cur_time = 1
4) cur_time = 2
5) cur_time = 3
6) cur_time = 4
7) answer = [4]
8) cur_price = 2
9) cur_time = 0
10) cur_time = 1
11) cur_time = 2
12) cur_time = 3
13) answer = [4, 3]
14) cur_price = 3
15) cur_time = 0
16) answer = [4, 3, 1]
17) cur_price = 2
18) cur_time = 0
19) cur_time = 1
20) answer = [4, 3, 1, 1]
21) cur_price = 3
22) cur_time = 0
23) answer = [4, 3, 1, 1, 0]
'Algorithm & Data Structure > Programmers' 카테고리의 다른 글
[programmers]Python_다리를 지나는 트럭 (0) | 2021.01.20 |
---|---|
[Programmers]Python_기능개발 (0) | 2021.01.19 |
[Programmers]Python_멀쩡한 사각형 (0) | 2021.01.17 |
[Programmers] Python_124 나라의 숫자 (0) | 2021.01.15 |
[Programmers]Python_프린터 (0) | 2021.01.14 |