(프로그래머스 with python) 프린터
주식 가격 (Level2)
중간에 값이 내려가는 경우에 cnt카운트를 멈추고 answer에 cnt를 append해주어야 하지만 이에 대한 로직이 존재하지 않아 무조건 끝까지 한번씩 돌고나서 멈추기 때문에 cnt가 계속해서 카운트가 된다
def solution(prices):
answer = []
while True:
for i in range(0, len(prices)-1):
cnt = 0
for j in prices[i+1:]:
if prices[i] <= j:
cnt += 1
answer.append(cnt)
break
answer.append(0)
return answer
else문으로 중간에 값이 내려가는 경우에 대한 조건을 달아주면 된다. 값이 내려가는 경우 break문으로 루프를 빠져나와 cnt값을 append해준다. (여기서 else안에서도 cnt+=1 이 있는 이유는 문제 조건이 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다. 이렇기 때문에 내려가도 cnt+=1은 한번 되야하는 것 같다.. ^^;;)
def solution(prices):
answer = []
for i in range(0, len(prices)):
cnt = 0
for j in prices[i+1:]:
if prices[i] <= j: # 굳이 else문을 쓸 필요없음
cnt += 1
else:
cnt += 1
break
answer.append(cnt)
return answer
하지만 위의 로직은 효율성이 0점인 로직이다 … 큐를 이용해 풀어야 풀리는데 이 부분은 이유를 잘 모르겠다.. (나중에 이유를 추가해야겠다..) deque를 쓰면 popleft()를 쓸 수 있는데 pop(0)과 차이가 있는지 pop(0)으로 하면 효율성이 0점이다..
from collections import deque
def solution(prices):
queue = deque(prices)
answer = []
while queue:
first_num = queue.popleft() # 1
cnt = 0
for q in queue: # 2,3,2,3
cnt += 1 # 일단 먼저 카운트가 들어간다
if first_num > q: # [2,3,2,3]이 1과 비교됨
break # 값이 내려갔으니 더이상 for문을 돌 필요가 없다
answer.append(cnt)
return answer