본문으로 바로가기

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 >>

주어진 배열에서 자신의 위치 바로 뒤에 있는 큰 수가 무엇인지 찾는 문제 

 


풀이 >>

numbers를 순회하면서 stack 에 담겨있는 숫자가 numbers 보다 작으면 해당 숫자를 pop 시키고 

크면 stack 순회를 멈추고 numbers[i]를 저장한다. 

 

현재 숫자(numbers[i]) 가 stack의 최상단에 있는 숫자보다 크다는 것을 만족하지 못하면 어차피 이전에 쌓인 숫자들도 numbers[i]보다 크기 때문에 더 순회하지 않아도 된다. 

 

int[2] 인 배열을 선언하여 [0] = 숫자 [1] = 인덱스 로 판단했다. 

 

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