my study.

Coding Test/Programmers

[프로그래머스] 주식가격, java

fftl 2025. 2. 3. 22:53

- 문제

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

- 풀이

import java.util.*;

class Solution {
    
    //스택을 이용한 풀이가 생각나지 않아 구글 검색후 블로그를 참고하였습니다.
    
    public int[] solution(int[] prices) {
        
        //여러번 사용되는 주식가격의 크기를 담아줍니다.
        int len = prices.length;
        
        //답이되는 answer 배열의 크기가 len과 같기 때문이 미리 선언해줍니다.
        int[] answer = new int[len];
        
        //문제 풀이에 사용될 Stack을 생성해줍니다.
        Stack<Integer> st = new Stack<>();
        
        //for문을 통해 주식가격을 순서대로 꺼내며 확인합니다.
        for(int i=0; i<len; i++){
            
            //Stack이 비어있다면 다른 연산 없이 
            //채워주고 다음 주식가격을 확인합니다.
            //Stack에는 주식가격과 주식가격의 index를 함께 
            //확인하기 위해 index를 Stack에 넣어주며 비교합니다.
            if(st.isEmpty()){
                st.add(i);
                
            //Stack이 비어있다면 이전의 주식가격과 현재 i번째의 주식가격을 비교해봐야 합니다.
            } else {
                
                //먼저 Stack에의 가장 위에 있는 주식가격이
                //i번째 주식가격보다 크거나 같다면 Stack에 그대로 주식가격을 추가해줍니다.
                if(prices[st.peek()] <= prices[i]){
                    st.add(i);
                
                //i번째 주식가격이 Stack 최상단의 주식가격보다 작다면, 주식가격이 떨어졌다고 판단할 수 있습니다.
                } else {
                    
                    //그럼 해당 주식가격을 꺼내주고, 해당 주식가격은
                    //Stack에 들어간 이후(해당 주식가격의 index)부터 i초까지 주식가격이 떨어지지 않았다고 판단할 수 있기
                    //때문에 해당 위치에 i-costIdx를 answer[coastIdx]에 담아줍니다.
                    
                    //또 그 이전에 담아졌던 주식가격들 또한 i번째 주식가격보다 크다면 동일하게 처리해줍니다.
                    //마지막으로 while 연산의 반복을 통해 Stack이 비어질 수 있기 
                    //때문에 !st.isEmpty() 조건을 while에 꼭 넣어줍니다.
                    while(!st.isEmpty() && prices[st.peek()] > prices[i]){
                        int costIdx = st.pop();
                        answer[costIdx] = i-costIdx; 
                    }
                    
                    //Stack의 주식가격을 확인한 후 i또한 Stack에 추가해줍니다.
                    st.add(i);
                }
            }
        }
        
        //이제 모든 주식가격을 확인했고, 끝까지 Stack에 남아있는
        //주식 가격의 경우 prices가 끝날때 까지 주식가격이 떨어지지 않았다고
        //판단할 수 있습니다.
        
        //따라서 prices의 마지막 index인 (len-1) - 해당 주식가격의 index인 n 값을
        //각각 answer에 추가해줍니다.
        if(!st.isEmpty()){
            for(int n : st){
                answer[n] = (len-1)-n;
            }    
        }
        
        //답을 반환합니다.
        return answer;
    }
}