input
answer
input
배열의 인덱스 0부터 n-1(input
의 길이)까지 반복문에 넣고 비교stack
에 가장 마지막으로 들어간 값과, input
배열의 수를 비교하여, 오른쪽의 수가 큰지 아닌지 확인한다.stack
을 확인하여 작은 수들의 오큰수를 대입한다.stack
에 pushstack
이 비어있으면, stack
에 넣는다.BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] input = new int[n];
int[] answer = new int[n];
String arr = br.readLine();
StringTokenizer st = new StringTokenizer(arr);
for (int i = 0; i < n; i++) {
input[i] = Integer.parseInt(st.nextToken());
answer[i] = -1;
}
input
생성, 오큰수를 저장하기 위한 배열 answer
생성input
에는 수열을 저장answer
에는 -1로 초기화Stack<Integer> stack = new Stack<>();
for (int i = 0; i < n; i++) {
while (!stack.isEmpty() && input[stack.peek()] < input[i]) {
answer[stack.pop()] = input[i];
}
stack.push(i);
}
input
을 순회하며 현 index
와 stack
의 peek
값 비교stack
에 해당 index
를 push
stack
의 peek
값을 index
로 가지는 input
의 값보다 현재 비교중인 i
를 index
로 가지는 input
의 값이 더 크기 때문에,stack
의 peek
값의 오큰수(answer[stack.peek()]
)는 input[i]
가 된다.stack
에서 pop
해야 하므로, answer[stack.pop()]
을 사용하여 대입하는 것이 코드가 간결해진다.while
문을 사용하여, stack
의 peek
값이 input[i]
보다 작을 때까지, stack
의 peek
값을 input[i]
로 대입한다.stack
의 peek
값을 index
로 가지는 input
의 값보다 큰 값을 찾아야 하므로, stack
에 현재 index
를 push
즉, 2-2를 반복하며 stack
의 peek
값을 확인하며 pop
하다가도, peek
값이 index
값보다 크다면, 반복 중지하고 stack
에 현재 index
값 push
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
sb.append(answer[i]).append(" ");
}
System.out.println
의 경우 시간초과 발생StringBuilder
사용 추천import java.io.*;
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[] input = new int[n];
int[] answer = new int[n];
String arr = br.readLine();
StringTokenizer st = new StringTokenizer(arr);
for (int i = 0; i < n; i++) {
input[i] = Integer.parseInt(st.nextToken());
answer[i] = -1;
}
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < n; i++) {
while (!stack.isEmpty() && input[stack.peek()] < input[i]) {
answer[stack.pop()] = input[i];
}
stack.push(i);
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
sb.append(answer[i]).append(" ");
}
System.out.println(sb);
}
}