개발지/코테

[프로그래머스] 코테연습 - 뒤에 있는 큰 수 찾기(lv.1)

개발지의 개발자 2023. 10. 26. 17:37

- 내 방법 풀이

  • 처음에 문제를 보고, 스택보다 Arrays.sort를 사용하여 풀려고 했으나 크면서 가장 가까이 있는 수를 찾기에 시간복잡도가 커 알맞지 않은 방법이었다.
  • 아직 스택을 알고리즘에 적용하는 것이 어려워 개념을 재정리해야겠다는 생각이 들었다.
  • 다른 사람의 풀이를 참고하여, 스택을 활용하여 풀었다.
  • Stack은 LIFO(Last In First Out), 가장 마지막에 추가된 항목은 맨 바깥쪽에 위치한다. Pop시 가장 먼저 제거됨.
  • Stack에 index를 대신할 i를 넣는다. 이후 while문을 통해 스택에 있는 index를 뽑아 해당 인덱스보다 큰 numbers[i]을 찾아 answer[i]에 할당해준다.
  • 핵심은 Stack에 i를 넣어 answer의 인덱스로 활용하는 것.
    Stack peek를 통해 꺼내진 Index의 numbers[Index]가 numbers[i]의 비교를 통해 answer[Index]에 할당되는 구조.
import java.util.*;

class Solution { 
    public int[] solution(int[] numbers) {
        int[] answer = new int[numbers.length];
        Stack<Integer> stack = new Stack<>();
        Arrays.fill(answer, -1);

        for (int i=0; i < answer.length; i++) {
            while (!stack.isEmpty() && numbers[stack.peek()] < numbers[i]) {
                answer[stack.pop()] = numbers[i];
            }
            stack.push(i);
        }
        return answer;
    }
}

- 다른 사람 방법 풀이

  • Stack을 이용하여 풀었다. Stack에 Index를 담고, pop하여 numbers[Index]와 다음 항인 number[i]를 비교하여 더 크다면 answer [Index] 에 할당. 아니면 다시 Stack에 push해준다.
import java.util.*;

class Solution {
    public int[] solution(int[] numbers) {
        int[] answer = new int[numbers.length];
        Arrays.fill(answer, -1);
        Stack<Integer> s = new Stack<>();
        s.push(0);
        for(int i = 1; i < numbers.length; i++){
            while(!s.isEmpty()){
                int idx = s.pop();
                if(numbers[i] > numbers[idx]){ // 뒤가 더 클때
                    answer[idx] = numbers[i];
                } else { // 앞이 더 크거나 같을 때
                    s.push(idx);
                    break;
                } 
            }
            s.push(i);
        }

        return answer;
    }
}