개발/Algorithm

프로그래머스 - 주식가격

보리ing 2021. 3. 9. 12:03

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

 

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

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

programmers.co.kr

 

    @Test
    void stockPrice(){

        int[] prices = new int[] { 2, 1, 2, 3, 1, 2, 4, 3 };

        int[] result = solution(prices);
        System.out.println(Arrays.toString(result));
    }

    public int[] solution(int[] prices) {

        int[] answer = new int[prices.length];
        Stack<int[]> stack = new Stack<>();

        for (int i = prices.length - 2; i >= 0; i--) {

            //앞의 가격이 더 클 경우 일수는 1,
            //앞으로 비교하게 될 값
            if (prices[i] > prices[i+1]){
                answer[i] = 1;
                int[] lowerPriceAndIdx = new int[] { prices[i+1],i+1};
                stack.push(lowerPriceAndIdx);
            } else {
                //앞이 더 낮은 경우 뒤에 나오는 낮은 가격과 비교 <- 저장된 스택과 비교
                while (!stack.isEmpty() && prices[i] <= stack.peek()[0]) {
                    //이후 이 값이 최저가격 기준이 될 것이기 때문에 고려하지 않아도 될 현재보다 큰 값들은 삭제
                    stack.pop();
                }

                //stack이 비었다는 것은 현재 가격이 가장 작은 것!
                if (stack.isEmpty()){
                    answer[i] = prices.length - i -1;
                } else {    //stack까지 일수
                    answer[i] = stack.peek()[1] - i;
                }
            }
        }

        return answer;
    }