https://www.acmicpc.net/problem/2493
탑을 선택했으면 없애는 것이 포인트
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayDeque;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int[] answer = new int[N];
ArrayDeque<int[]> top = new ArrayDeque<>();
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++){
int height = Integer.parseInt(st.nextToken());
// stack 상단에 있는 탑의 높이가 현재 탑보다 작으면 제거
while(!top.isEmpty() && top.peek()[0]<height){
top.pop();
}
if(top.isEmpty()){
answer[i] = 0;
} else{
answer[i] = top.peek()[1]+1; //index+1
}
top.push(new int[]{height, i}); // {값, 순서} 넣기
}
for(int a : answer)
bw.write(a+" ");
bw.flush();
bw.close();
br.close();
}
}