감자튀김 공장🍟

[프로그래머스/Lv.2] 주식가격 (with 파이썬) 본문

Algorithm/Programmers

[프로그래머스/Lv.2] 주식가격 (with 파이썬)

Potato potage 2023. 4. 4. 00:29
반응형

✔ 문제

문제 설명

 

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

 

제한사항

  • prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
  • prices의 길이는 2 이상 100,000 이하입니다.

 

https://school.programmers.co.kr/learn/courses/30/lessons/42584

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


풀이

오답 코드

def solution(prices):
    idx = 0
    answer = [-1] * len(prices)
    
    for i in range(len(prices)):
        answer[i] = len(prices) - (i + 1) # [4, 3, 2, 1, 0]
    
    while prices:
        x = prices.pop(0)
        
        for i in range(len(prices)):
            if prices[i] < x:
                answer[idx] = (i+1)
        idx += 1
                
    return answer

예시1과 테스트1만 통과하는 기적의... 코드..

반례에 대해서는 어떠한 것도 대비되어 있지 않은 코드다.

 

먼저 생각한 방법은 answer 리스트에 각자 최대로 가질 수 있는 초를 저장한 후

prices 요소 중에 x보다 작은 값이 있다면 x와의 인덱스 차를 answer 값에 저장한다.

 

 

효율성 테스트 실패

from collections import deque

def solution(prices):
    prices = deque(prices)
    answer = []
    
    while prices:
        x = prices.popleft()
        time = 0
        
        for i in range(len(prices)):
            if x > prices[i]:
                time += 1
                break
            else:
                time += 1
        answer.append(time)
        
    return answer

prices를 deque로 변환하여 pop(0) 대신 popleft()를 사용했다. << 이게 더 빠르기 때문에

복잡하게 answer를 최대로 가질 수 있는 초로 저장해놓는 것이 아니라

for문을 돌면서 x가 남은 prices[i]보다 크면 (prices[i]가 x보다 작다. 즉, 주식이 x보다 떨어졌음) time +=1 을 하고 바로 break를 건다. 남은 prices의 값의 초들을 굳이 마저 셀 필요가 없다.

 

 

정답 코드

from collections import deque

def solution(prices):
    prices = deque(prices)
    answer = []
    
    while prices:
        x = prices.popleft()
        time = 0
        
        for i in prices:
            time += 1
            if x > i:
                break
        answer.append(time)
        
    return answer

2번 코드보다 더 간소화 시켰다.

range(len(prices)가 아니라 in prices를 사용하고 if-else문을 if문 하나로 줄였더니 효율성 테스트를 모두 통과할 수 있었다.


후기

더 쉬운 방법이 있는데 왜 이렇게 돌아가려고 하는지 모르겠다.

그리고 돌아가더라도 맞으면 괜찮은데 예제에만 맞춘 답안이 나오니까 풀다보면 계속 당황스러움의 연속이 된다..

 

 

 

 

 

 

 

 

반응형
Comments