programmers

[JAVA] ☆ 뒤에 있는 큰 수 찾기

아잠만_ 2024. 7. 19. 10:31

문제 설명
정수로 이루어진 배열 numbers가 있습니다. 배열 의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수라고 합니다.
정수 배열 numbers가 매개변수로 주어질 때, 모든 원소에 대한 뒷 큰수들을 차례로 담은 배열을 return 하도록 solution 함수를 완성해주세요. 단, 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다.

제한사항
4 ≤ numbers의 길이 ≤ 1,000,000
1 ≤ numbers[i] ≤ 1,000,000

풀이

import java.util.*;
class Solution {
    public int[] solution(int[] numbers) {
        int[] answer = new int[numbers.length];
        int max = 0;
        Stack<Integer> st = new Stack<>();
        for(int i=numbers.length-1; i>=0; i--){
            // st에 없는 경우 -1
            if(st.size()==0||max<numbers[i]){
                st.clear();
                st.push(numbers[i]);
                max=numbers[i];
                answer[i]=-1;
                continue;
            }
            while(st.peek()<=numbers[i]){
                st.pop(); 
                if(st.size()==0) break;
            }
            if(st.size()==0){
                st.push(numbers[i]);
                max=numbers[i];
                answer[i]=-1;
                continue;
            }
            answer[i]=st.peek();
            st.push(numbers[i]);
        }
        return answer;
    }
}

간단한 풀이 방법

import java.util.*;
class Solution {
    public int[] solution(int[] numbers) {
        int[] answer = new int[numbers.length];
        Arrays.fill(answer, -1);
        int max = 0;
        Stack<Integer> st = new Stack<>();
        for(int i=numbers.length-1; i>=0; i--){
            while(!st.isEmpty()){
                if(numbers[i]<st.peek()){
                    answer[i]=st.peek();
                    break;
                } 
                st.pop();
            }
            st.push(numbers[i]);
        }
        return answer;
    }
}