코딩코딩

[프로그래머스] level2 주식가격 - 파이썬(Python)

Jerry Jun 2020. 8. 23. 18:15
728x90

문제

 

코딩테스트 연습 - 주식가격

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은 1 이상 10,00

programmers.co.kr

 

 

코드

# 효율성 1,2,3,4,5 실패
import numpy as np

def solution(prices):
    answer = []
    prices = np.array(prices)
    for i in range(len(prices)-1):
        if(prices[i] <= min(prices[i+1:])):
            answer.append(len(prices) - i - 1)
        else:
            answer.append(np.where(prices[i+1:] < prices[i])[0][0] + 1)
    answer.append(0)
    return answer

역시 적은 데이터에서 numpy 는 너무 무거운 것이다. 효율성 전체 실패

 

 

 

# 효율성 3 실패
from collections import deque
def solution(prices):
    prices = deque(prices)
    answer = []
    num = prices.popleft()
    length = len(prices)
    while(length != 0):
        count = 0
        for i in range(length):
            if num <= prices[i]:
                count += 1
            else:
                count += 1
                break
        answer += [count]
        num = prices.popleft()
        length -= 1
    answer.append(0)
    return answer

deque 를 사용하여 코딩 해보았지만 아쉽게 효율성 3에서 실패하였다.

 

 

# 성공
def solution(prices):
    answer = [0] * len(prices)
    for i in range(len(prices)-1) :
        for j in range(i+1, len(prices)) :
            answer[i] += 1
            if prices[i] > prices[j] : 
                break
 
    return answer

3차시도 : 성공

코드풀이

이 문제는 얼마나 효율적으로 잘 코딩하느냐에 초점을 두었던 문제인 것 같다.

기준이 되는 숫자와 그 이후의 숫자들을 비교해 기준 숫자보다 떨어지면 그 간격을 계산해야 한다.

 

첫 번째 : answer 배열을 주어지는 prices 의 길이만큼 0을 채워 만든다.

두 번째 : 반복문 시작( prices 길이 - 1 만큼. -1을 하는 이유는 어차피 마지막은 0이기 때문)

세 번째 : i+1부터 시작하는 반복문 시작. (다음 숫자부터 비교해야 함)

네 번째 : 0이었던 배열 요소를 +1 씩 증가.

다섯 번째 : 만약 기준 숫자가 다음 숫자보다 크면 바로 종료하고 다음 기준숫자 이동!

 

이렇게 간단히 짤 수 있는 것을 너무 돌아왔다....

 

Numpy --> Deque --> 결국 for...

 

correct
성공

 

programmers

300x250