Algorithm

[프로그래머스 / Level2] 주식 가격 (Java)

haehyun 2021. 12. 28. 18:03

문제

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

 

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

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

programmers.co.kr

 

풀이

지문을 이해하는 것이 힘들었다. "가격이 떨어지지 않은 기간은 몇 초인가?"를 구하는 것이 문제인데, 어떻게 하면 저 테스트케이스(입력)에서 저 값들이 리턴된 것인지 이해가 안 됐기 때문이다.

prices 내가 예상한 return값 실제 return값
[1, 2, 3, 2, 3] [1, 2, 3, 0, 1]
1초 : 1초간 상승중
2초 : 2초간 상승중
3초 : 3초간 상승중
4초 : 1초간 하락중 = 0초간 상승중
5초 : 1초간 상승중
[4, 3, 1, 1, 0]

 

결국 다른 사람들의 코드를 보고 문제에서 뭘 구하고자 하는지 파악할 수 있었다.
prices 배열에는 1초~n초까지 해당 시간에서의 주식가격이 들어있으며, 하나의 요소를 기준으로 "현재 시간보다 뒤의 시점에 해당 요소(=현 시점 주식 가격)보다 가격이 떨어지지 않는 기간이 몇초인가?" 를 구하고 있으며 이말은 "현재 시간의 주식 가격보다 높거나 같은 주식 가격을 가진 기간은 몇 초 인가?"라고 해석할 수 있다.

<테스트케이스의 리턴 값이 {4, 3, 1, 1, 0}인 이유>

prices[0] = 1      // 1초 시점에서 주식 가격
answer[0] = 4    // 1초 시점에서 ~ 마지막까지 가격이 떨어지지 않는 기간(초)

 

prices[1] = 2     // 2초 시점에서 주식 가격
answer[1] = 3    // 2초 시점에서 ~ 마지막까지 가격이 떨어지지 않는 기간(초)

 

prices[2] = 3 → answer[2] = 1

 

prices[3] = 2  → answer[3] = 1

 

prices[4] = 3  → answer[4] = 0

위 과정을 통해 몇 가지 규칙을 알아낼 수 있다.

  • prices의 각 가격은 1이상 10,000이라인 자연수라는 제한사항 때문에 주식 가격의 최솟값은 1이다.
  • prices 배열 요소의 값이 1이면 '가격이 떨어지지 않은 기간'은 뒤에 위치한 요소들의 개수(prices.length - i - 1)이다.
  • prices 배열 요소의 값이 1이 아니면 '가격이 떨어지지 않은 기간'은 뒤에 위치한 요소들 중 기준 요소(prices[i]) 보다 값이 크거나 같은 요소의 개수이다.
  • 결과 배열의 마지막 값은 무조건 0이다. (마지막 요소 보다 크거나 같은 가격의 기간이 하나도 없음)
  • 주식 가격이 떨어지지 않은 기간 = 주식 가격이 현재 값보다 같거나 높은 기간
  • 주식가격이 3초에는 3, 4초에는 2일 경우, 주식 가격이 변동되는 간격(1초) 구간에 주식 가격이 순차적으로 (3.0, 2.9, 2.8,... 2.0) 하락하는 것이 아니다. 3초에서는 3.0, 4초에서 2.0 으로 1초 단위로 변경되는 것이다. 3초부터 4초 사이의 간격 1초 동안은 주식 가격에 변동이 전혀 없으며, 3초 시점의 주식 가격인 3으로 유지된다. (=주식 가격이 떨어지지 않은 기간은 기본 1초 이상 - ※마지막 요소 제외)

 

코드

class Solution {
    public int[] solution(int[] prices) {
        int[] answer = new int[prices.length];              // 가격이 떨어지지 않은 기간(초)

        // 마지막 요소 결과는 무조건 0이기에 제외
        for (int i = 0; i < prices.length -1; i++) {
            // 현재 요소보다 뒤에 있는 요소들 순차 체크
            for (int j = i + 1; j < prices.length; j++) {
                answer[i] += 1;
                // 현재 요소 값보다 작을 경우 (가격이 떨어짐)
                if (prices[i] > prices[j]) {
                    break;
                }
            }
        }

        return answer;
    }
}