/ ALGORITHM

(프로그래머스 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