본문 바로가기

공부/알고리즘

[프로그래머스 스택/큐]주식 가격 - Python3

문제

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

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

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

 

코딩테스트 연습 - 주식가격 | 프로그래머스

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은 1 이상 10,000 이하인 자연수입니다. prices의 길이는 2 이상 100,000 이하입니다. 입출력 예 prices return [1, 2, 3, 2, 3] [4, 3, 1, 1, 0] 입출력 예 설명 1초 시점의 ₩1은 끝까지 가격이 떨어지지

programmers.co.kr

입력

  • 각 초의 시점에 주식 가격을 나타낸 배열

출력

  • 가격이 떨어지지 않고 있는 시간을 담은 배열

 

알고리즘

def solution(prices):
    # 정담을 담을 배열
    answer = [0] * len(prices)
    
    # i, j를 이용해서 2중 for문으로 해결할 것
    # 첫 번째 for문의 인덱스 i는 0번째부터 len(prices)-1 까지 움직인다
    # 그 다음 for문의 인덱스 j는 1번째부터 len(prices)까지 움직인다. 
    for i in range(0, len(prices)-1):
        for j in range(i + 1, len(prices)):
            # 순회하면서, 일단 answer 배열의 i번째 원소를 1 증가시킨다.
            answer[i] += 1
            
            # 현 시점의 값보다 낮은 값이 나오는 순간 반복을 멈춘다.
            if prices[i] > prices[j]:
                break

    return answer


 

설명

  1. 정답을 담을 배열 생성한다.   
  2. i와 j를 이용해서 2중 for문을 돌린다.
    1. 값이 들어온 순간에 일단 answer[i] 값을 1 증가시킨다. 시점이나 기준에에 대해서 문제 설명이 좀 부족한 것 같다. 이해는 잘 되지 않지만 이렇게 하니까 답이 나온다.
    2. 그리고, 인덱스 j가 prices배열을 순회하면서, prices[j]의 값을 prices[i]의 값과 비교한다. 만약 prices[j]의 값이 작다면, 값이 떨어진 것이므로, answer[i]의 값을 증가시키는 것을 중지한다(break)

결과

원하는 결과를 출력한다.

후기

문제 설명이 너무 대충 쓰여있는 것 같다. 문제대로 따라간 게 아니라, 그냥 이렇게도 해보고 저렇게도 해보고 하다보니까 정답이 나오길래 돌려보니까 통과가 되었다. 가능하면 스택을 사용하려고 했는데, 문제도 이해 못한 상태에서 사용하려니깐 머리아파서 그냥 배열로 풀었다. 지금에야 효율성 테스트까지 통과를 하지만, 코딩 테스트에선 이런 코드로는 통과 못할 것 같다.