본문 바로가기
Algorithm/프로그래머스

[프로그래머스] [Python] Level2_주식가격

by 은세라 2021. 8. 5.

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

 

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

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

programmers.co.kr

1차 시도

def solution(prices):
    answer = [0 for i in range(0,len(prices))]
    prices_r = prices[::-1]
    
    for i in range(1,len(prices_r)):
        #앞에 나보다 작으면 break
        if prices_r[i-1] < prices_r[i]: answer[i] = 1
        #앞에 나보다 크거나 같으면 answer[i]+=1
        else:
            for j in range(0,i):
                if prices_r[i-1] >= prices_r[i]: answer[i] += 1

    return answer[::-1]

2차 시도

def solution(prices):
    answer = []
    stack = []
    
    for i in range(0, len(prices)): 
        for j in range(i+1, len(prices)):
            if (prices[i] <= prices[j]): 
                stack.append(prices[j])
            elif(prices[i] > prices[j]) : #다음가격이 떨어지면 뒤에꺼 상관없이 무조건 1
                stack = [1]
                break
            #push끝
        answer.append(len(stack))
        stack = []
    return answer

3차 시도

def solution(prices):
    answer = []
    
    for i in range(0, len(prices)-1): 
        stack = []
        for j in range(i+1, len(prices)): 
            stack.append(prices[j])
            if(prices[i] > prices[j]) : #다음가격이 떨어지면 뒤에꺼 상관없이 무조건 1
            	#stack = [1]
                break
        answer.append(len(stack))
    answer.append(0) #마지막은 무조건 0
    return answer

 

마지막에 애 먹은 부분이 break위에 주석처리한 부분이다.

다음 가격이 떨어졌을 때 stack을 [1]로 초기화하는 것이 아니라 break해서 바로 나오면 됐었다.

 

다음 가격이 떨어진다는 것이 바로 다음이 아니라 몇 개 유지/상승하다가 떨어지는 것도 있는데,

break 앞에서 stack = [1]로 초기화해버리면 몇 개 유지/상승 된 것도 다 날아가버린다.

(이해하고 보니 넘나 당연한 것... 예시 테스트케이스 통과한다고 너무 막 짰다.)

 

  • 가격이 유지/상승만 하는거는 1 이상
  • 가격이 나중에 하락하는 케이스는 전부 1

주어진 예시를 찬찬히보면 하락하는 케이스에 대한 테스트를 하기 힘들게 주어져있다.

(주어진 예시 테스트케이스가 너무 별로다)

 

다 사람들이 올린 질문을 보니 아래 테스트케이스를 추천해줬다.

prices = [ 1, 2, 3, 2, 3, 1 ]

return = [ 5, 4, 1, 2, 1, 0 ]

 

💡최종로직

1. prices 맨처음부터 뒤에서 하나 전까지 순회한다

  1-1. 순회를 시작할 때 stack을 초기화한다

2. i 다음 값부터 prices 맨 뒤까지 순회한다

3. 다음 가격이 떨어지면 break한다

4. answer에 stack의 길이를 넣는다

 

댓글