문제 출처
https://www.acmicpc.net/problem/17298
문제
크기가 N인 수열 A = A1, A2, ..., AN이 있다. 수열의 각 원소 Ai에 대해서 오큰수 NGE(i)를 구하려고 한다. Ai의 오큰수는 오른쪽에 있으면서 Ai보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오큰수는 -1이다.
예를 들어, A = [3, 5, 2, 7]인 경우 NGE(1) = 5, NGE(2) = 7, NGE(3) = 7, NGE(4) = -1이다. A = [9, 5, 4, 8]인 경우에는 NGE(1) = -1, NGE(2) = 8, NGE(3) = 8, NGE(4) = -1이다.
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.
출력
총 N개의 수 NGE(1), NGE(2), ..., NGE(N)을 공백으로 구분해 출력한다.
예제 입력 1
4
3 5 2 7
예제 출력 1
5 7 7 -1
예제 입력 2
4
9 5 4 8
예제 출력 2
-1 8 8 -1
풀이 방법
- 초기에는 2중 반복문으로 큰 숫자를 만나자마자 break 걸면 되지 않을까 했는데, 최악의 수는 언제나 존재했고 시간초과가 나타났다.
- 그래서 Stack을 활용하였다
- 인덱스를 stack에 넣고, 해당 인덱스에 있는 배열의 값과 현재 반복문의 값을 비교하여 순차적으로 값을 추가해준다.
- 만약 현재 A[i]값 보다, A[stack.peek()]이 더 클경우, 그냥 인덱스를 저장한다.
- 아니라면, 2번이 성립할 때 까지 result에 해당 숫자(stack.peek())를 저장한다.
- 마지막에 남은 인덱스는 오른쪽에 큰 숫자가 없다는 의미이므로, -1로 추가해준다.
풀이 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] A = new int[N];
int[] result = new int[N];
Stack<Integer> stack = new Stack<>();
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
// 오른쪽에서 왼쪽으로 탐색 (반대 방향)
for (int i = 0; i < N; i++) {
while (!stack.isEmpty() && A[stack.peek()] < A[i]) {
result[stack.pop()] = A[i];
}
// 현재 인덱스를 스택에 push
stack.push(i);
}
// 아직 남아있는 인덱스는 오큰수가 없으므로 -1
while (!stack.isEmpty()) {
result[stack.pop()] = -1;
}
// 출력
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
sb.append(result[i]).append(" ");
}
System.out.println(sb);
}
}
결과

회고
- 스택을 써도 시간초과가 날 수 있으므로 주의하자...
'알고리즘' 카테고리의 다른 글
| [프로그래머스] 보행자천국 - Java (2) | 2025.02.13 |
|---|---|
| [프로그래머스] 풍선 터트리기 - Java (1) | 2025.02.11 |
| [백준] 시그널 - Java (3) | 2025.02.05 |
| [백준] 채굴 - Java (2) | 2025.02.03 |
| [프로그래머스] 단속카메라 - Java (4) | 2025.02.03 |