본문 바로가기

알고리즘/Programmers

[프로그래머스] 주식가격 (Level 2, Python)

 

 

온라인에서 코딩테스트 문제를 풀 수 있는 프로그래머스의 Level2 주식가격 문제.

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

 

문제 설명

 

해당 문제는 초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간이 몇 초인지를 return하는 문제이다.

 

문제에서 주어진 테스트 케이스를 먼저 살펴보자.

 

[1, 2, 3, 2, 3]이 prices로 주어진다. 편의 상 가격을 원으로 통일한다.

 

1초 시점의 1원은 끝까지 가격이 떨어지지 않았다. 즉, 가격이 떨어지지 않은 기간은 4초이다.

2초 시점의 2원도 끝까지 가격이 떨어지지 않았다. 가격이 떨어지지 않은 기간은 3초이다.

3초 시점의 3원은 1초 후 가격이 2원으로 떨어졌다. 따라서 가격이 떨어지지 않은 시간은 1초이다.

4초 시점의 2원은 끝까지 가격이 떨어지지 않았다. 가격이 떨어지지 않은 기간은 1초이다.

5초 시점의 3원은 끝까지 가격이 떨어지지 않았지만 마지막 요소이기 때문에 가격이 떨어지지 않은 기간은 0초이다.

 

살펴본 것 처럼 문제는 간단하다. 바로 코드를 확인해보자.

 

코드 설명

 

작성한 코드는 다음과 같다. (python3)

 

def solution(prices):
  answer = []

  for i in range(0, len(prices)-1):
    fin = False
    for j in range(i+1, len(prices)):
      if prices[i] > prices[j]:
        answer.append(j-i)
        fin = True
        break
    if fin == False:
      answer.append(len(prices)-i-1)

  answer.append(0)

  return answer

 

코드의 순서는 다음과 같다.

 

  1. 먼저 반환값은 기록된 가격들의 가격이 떨어지지 않은 시간들을 기록해야 하기 때문에 배열로 선언한다.
  2. 첫 번째 루프의 범위는 0부터 prices의 길이 - 1까지다. 그 이유는 길이가 5인 배열이 있을 경우 마지막 요소는 항상 0초로 기록되기 때문에 첫 번째 루프에서는 3번째 인덱스까지만 돌면 되기 때문이다. 그리고 가격이 떨어졌는지 떨어지지 않았는지를 체크하기 위한 fin 변수를 False로 초기화한다.
  3. 두 번째 루프의 범위는 i+1부터 prices의 길이인 5까지다. 그 이유는 i의 뒤에 있는 인덱스부터 마지막 인덱스까지만 돌면 되기 때문이다.
  4. 그리고 두 번째 루프안에서 prices[i]와 prices[j]를 비교한다. prices[i]가 prices[j]보다 더 크다는 것은 가격이 떨어진 것이기 때문에 가격이 떨어질 때 까지 걸린 기간을 answer에 삽입하고 fin을 True로 변경한다.
  5. prices[i]가 prices[j]보다 작거나 같을 때는 가격이 떨어지지 않은 것이기 때문에 배열의 길이에서 i와 1을 빼준다. (1을 빼주는 이유는 i가 0부터 시작했기 때문)
  6. 마지막으로 prices 배열의 마지막 요소는 항상 가격이 떨어진 기간이 0이기 때문에 answer 배열에 0을 삽입한다.

 

안녕하세요. 평범한 대학생 개발자 yorr입니다.

포스팅을 읽고 궁금한 점 또는 문의가 있으신 분은 메일 또는 댓글을 남겨주세요.

 

Mail: twysg@likelion.org

Github: https://github.com/sangyeol-kim