https://school.programmers.co.kr/learn/courses/30/lessons/154539
정수로 이루어진 배열 numbers가 있습니다. 배열 의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수라고 합니다.
정수 배열 numbers가 매개변수로 주어질 때, 모든 원소에 대한 뒷 큰수들을 차례로 담은 배열을 return 하도록 solution 함수를 완성해주세요. 단, 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다.
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;
}
}