본문 바로가기
문제풀이(Java)

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

by @developer.kye 2020. 11. 28.

[프로그래머스][스택/큐][JAVA] 주식가격 스택으로 풀기

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

 

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

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

programmers.co.kr

 

순회를 하면서 자신보다 뒷쪽에 자신보다 더 작은값의 위치가 어디인지만 알면된다.

따라서 뒤에서부터 순회하면서 앞의값보다 작은 값들의 위치를 스택에 쌓아 기억하는 것이 핵심이다.

 

맨 마지막 숫자의 답은 무조건 0이니 그 전 숫자부터 순회한다.

순회를 하면서 다음과 같이 액션해주면 된다.

  • "다음 숫자가 나보다 작네?"
    • 현재 인덱스의 답(answer[i])을 1로 설정하고 스택에는 다음 숫자와 그 인덱스 [prices[i+1], i+1] 를 저장한다.
  • "다음 숫자가 나보다 같거나 크네?"
    • 스택을 확인한다.
      •  "스택 사이즈가 0이네?"
        • 현재 인덱스의 값은 배열 끝까지 자기보다 작은 수가 없는 것이므로 현재 인덱스부터 배열끝까지의 길이인 것이다.
          즉, answer[i] = length - 1 - i
      • "스택 사이즈가 0보다 크네?
        • 스택 마지막 아이템의 숫자값이 현재 숫자값보다 크거나 같은건 다 지워준다.
        • 다 지운 후에 스택이 없어지면 위에 처럼 answer[i] = length - 1 - i 로 값을 내주면 된다.
        • 다 지웠는데 아직 스택에 값이 남아있다면, answer[i]는 스택 마지막 아이템의 인덱스값과 현재 인덱스의 차이인 stack.peek()[1] - i 가 된다.
          즉, answer[i] = stack.peek()[1] - i 

 

 

import java.util.Stack;
class Solution {
    public int[] solution(int[] prices) {
        int length = prices.length;
        int[] answer = new int[length];
        Stack<int[]> stack = new Stack<>();
        
        answer[length-1] = 0;
        
        for(int i= length-2; i>=0; i--){
            if(prices[i] <= prices[i+1]){
                
                while(stack.size() > 0 && stack.peek()[0] >= prices[i]){
                    stack.pop();
                }
                
                if(stack.size() == 0){
                    answer[i] = length - i - 1;
                } else {
                    answer[i] = stack.peek()[1] - i;
                }
                
            } else {
                answer[i] = 1;
                stack.push(new int[] {prices[i+1], i+1});
            }
        }
        return answer;
    }
}

'문제풀이(Java)' 카테고리의 다른 글

[프로그래머스] Level 2/스킬트리/Java  (0) 2020.08.31