Algorithm
프로그래머스: 뒤에 있는 큰 수 찾기(JAVA)
10Biliion
2025. 6. 19. 19:09
문제 설명
- 정수로 이루어진 배열 numbers가 주어집니다.
- 각 원소에 대해 자신보다 뒤에 있는 숫자 중에서 처음으로 자신보다 큰 수를 찾아야 합니다.
- 그런 수가 없다면 -1을 대신 넣습니다.
입력 예시
int[] numbers = {2, 3, 3, 5};
출력 예시
[3, 5, 5, -1]
풀이
이 문제는 단순히 이중 for문으로 O(N^2) 시간 복잡도로도 풀 수 있지만,
최적화가 필요한 경우 스택을 이용한 역순 순회 방식이 효율적입니다.
✅ 핵심 전략:
- 배열을 오른쪽 → 왼쪽으로 순회
- 자신보다 큰 수가 나올 때까지 스택 pop
- 조건을 만족하는 수를 만나면 answer에 저장하고 현재 수를 다시 push
Java 코드 (스택)
import java.util.*;
class Solution {
public int[] solution(int[] numbers) {
int[] answer = new int[numbers.length];
Stack<Integer> stack = new Stack<>();
// 배열을 뒤에서부터 순회
for (int i = numbers.length - 1; i >= 0; i--) {
// 현재 수보다 작거나 같은 수는 필요 없음 (pop)
while (!stack.isEmpty() && stack.peek() <= numbers[i]) {
stack.pop();
}
// 스택이 비었다면 -1, 아니면 peek가 정답
answer[i] = stack.isEmpty() ? -1 : stack.peek();
// 현재 숫자를 스택에 push
stack.push(numbers[i]);
}
return answer;
}
}
시간 복잡도
- 시간복잡도: O(N)
→ 각 원소는 스택에 한 번 push, 한 번 pop만 되기 때문에 총 연산은 2N 이내입니다.