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

JeongYong·2023년 4월 28일
0

Algorithm

목록 보기
139/275

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/154539

문제 설명

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

제한사항

알고리즘: stack, 자료구조

풀이

O(N^2) 풀이는 길이가 1,000,000이기 때문에 불가능하다. 그래서 다른 풀이를 생각해야 하는데 그 풀이가 stack을 이용한 풀이다.
numbers 배열을 차례대로 확인하면서, stack에 top부분과 비교해 준다. top에 값이 더 크다면 numbers[i]의 가장 가까이 있는 수이기 때문에 pop을 해주고, stack이 비거나, numbers[i] 보다 큰 값이 나올 때까지 pop해준다. 다 끝났다면 numbers[i]의 뒷 큰수도 찾아야하기 때문에 stack에 넣어준다. 그리고 모든 배열의 요소를 확인했을 때 stack에 아직도 값이 남아있다면 그 값들의 뒷 큰수는 존재하지 않는다는 의미이기 때문에 -1로 채우고 출력하면 된다.

소스 코드

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

0개의 댓글