주식가격

김민석·2021년 2월 27일
0

오답노트 Lv.2

목록 보기
2/8

아래는 최초 내가 풀었던 방법이다.

def solution(prices):
    # answer의 초기값을 설정한다. 예를 들어 length가 5인 list가 parmeter로 전달된다면,
    # [4,3,2,1,0] 
    answer = [len(prices)-i-1 for i in range(len(prices))]
    #이전 값을 저장할 stack, idx 생성
    stack, idx = [],[]     
    
    for time, price in enumerate(prices) :
        
        # stack이 빈 리스트가 아니며 and price가 stack[-1]보다 작으면 아래의 while문을 실행한다.
        while stack and stack[-1] > price:
            #stack의 [-1]요소 제거
            stack.pop()
            #idx의 [-1]요소를 idx에서 제거 후, answer_idx에 할당. 
            answer_idx = idx.pop()
            #answer_idx를 이용하여 time과의 시간적 거리를 계산 후, answer에서 해당 값을 대체.
            answer[answer_idx] = time - answer_idx 
        
        #기본적인 과정임. stack과 idx에 각각 price/time을 쌓음
        stack.append(price)
        idx.append(time)

    return answer

그러나 불필요한 부분이 있었다.

  • stack에는 price를 저장하고, idx에 또 index를 저장한 점

이 바로 그것이다.
굳이 그럴 필요가 없었다.

왜냐하면 parameter로 들어오는 list 자체의 순서를 바꾸지 않았으므로 prices[idx]로 바로 접근하면 되는 것이었다.

따라서, stack에 price가 아닌, idx를 쌓는 것으로 바꿔주었다.

def solution(prices):
    
    answer = [len(prices)-i-1 for i in range(len(prices))]
    stack=[]    
    
    for time, price in enumerate(prices) :
        
        while stack and prices[stack[-1]] > price:
            answer_idx = stack.pop()
            answer[answer_idx] = time - answer_idx 
        
        stack.append(time)

    return answer

0개의 댓글