코딩테스트
백준 17298번 오큰수(자바) - 스택
leeeehhjj
2023. 5. 12. 19:19
풀이 방법
1. arr[i]의 값이 arr[i-1] 보다 큰 경우가 나올 때까지 i를 stack에 push 한다.
-> 만약 arr[i] 값이 arr[i-1] 보다 작다면 arr[i]의 값이 스택에 있는 모든 인덱스에 저장되어 있는 수보다 작다는 의미이다.
2. arr[i] > arr[i-1] 인 경우 arr[i]보다 큰 수가 나올 때까지 stack에서 인덱스를 하나씩 pop한다.
이 경우 오큰수를 발견한 것이므로 arr[stack.pop()] = arr[i] 해준다.
arr[i] 보다 큰 수가 나왔다면 더이상 pop하지 않고 i를 push 해준다.
3. 인덱스 맨 끝까지 탐색을 마쳤다면 스택에 있는 값을 하나씩 pop 해주며 해당 인덱스에 -1 값을 넣어준다.
(이 경우 자신보다 큰 오큰수를 발견하지 못한 것이다.)
*시간 초과
: 그냥 System.out.print를 통해 출력했을 때 시간초과가 났다.
Stringbuilder 사용하자
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < n; i++) {
while (!stack.isEmpty() && arr[stack.peek()] < arr[i]) {
int idx = stack.pop();
arr[idx] = arr[i];
}
stack.add(i);
}
while (!stack.isEmpty()) {
arr[stack.pop()] = -1;
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < n; i++) {
sb.append(arr[i]).append(' ');
}
System.out.println(sb);
}
}