my study.

Coding Test/Programmers

[프로그래머스] 뒤에 있는 큰 수 찾기, java

fftl 2025. 1. 31. 16:19

- 문제

 

프로그래머스

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

programmers.co.kr

- 풀이

import java.util.*;

class Solution {
    public int[] solution(int[] numbers) {
        
        //답안의 크기는 numbers와 같기 때문이 미리 선언해줍니다.
        int[] answer = new int[numbers.length];
        
        //Stack을 이용해 문제를 풀이합니다.
        //Stack에 numbers 값들의 index를 넣어 비교를 진행합니다.
        Stack<Integer> st = new Stack<>();
        
        //시작시에 첫번째 numbers 값인 0번 인덱스를 넣어줍니다.
        st.add(0);
        
        //이제 두번째 수 부터 탐색을 시작합니다.
        for(int i=1; i<numbers.length; i++){
            
            //현재 index의 값을 now에 담아줍니다.
            int now = numbers[i];
            
            //만약 탐색 진행 중 stack이 비어있다면, 비교 할 수가 없으므로
            //그대로 stack에 i를 추가해줍니다.
            if(st.isEmpty()){
               st.add(i);
                
            //stack이 비어있지 않다면 비교를 시작합니다.
            //stack에 남아있는 수들은 "현재까지 해당 수보다 큰 수가 발견되지 않았다"를 의미합니다.
            //즉 이번 i번째 수가 그들보다 클 수 있기 때문에 while을 통해 모두 확인합니다.
            } else {
                
                //now가 stack의 수보다 클 경우 pop을 통해 꺼내주고 
                //answer의 해당 index에 표시를 해줍니다.
                //이렇게 pop()을 하다가 stack이 비어질 수 있으니 
                //isEmpty()를 통해 비어있는지도 확인해줍니다.
                while(!st.isEmpty() && numbers[st.peek()]<now){
                    answer[st.pop()] = now;
                }
                
                //이번 now에 대한 탐색이 끝나면 현재 수는 stack에 추가해줍니다.
                st.add(i);
            }
        }
        
        //위의 for문이 끝날 때까지 stack에 남아있는 수들은
        //끝까지 보다 큰 수가 나타나지 않았다는 뜻입니다.
        //해당 index의 위치에는 모두 -1을 담아줍니다.
        for(int i : st){
            answer[i] = -1;
        }

        //만들어진 answer 배열을 반환합니다.
        return answer;
    }
}