2493번 탑에서 발사한 신호 수신하기

못 풀었다, 스택으로 풀어야한다는 걸 알고도 못풀었다ㅠ_ㅠ 풀이 힌트를 얻어서 나만의 코드로 만들긴했지만… 아쉽다. StringBuilder 쓰면 더 빨랐을텐데. 출력에서 느렸다. StringBuilder sb = new StringBuilder(); for(int idx : receive) ans.append(idx).append(" ") System.out.print(ans);

import java.util.*;  
import java.io.*;  
  
public class BJ_2493 {  
  
    public static class Tower {  
        int height;  
        int num;  
        Tower(int height, int num) {  
            this.height = height;  
            this.num = num;  
        }  
    }  
  
    public static void main(String[] args) throws IOException {  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        int n = Integer.parseInt(br.readLine());  
        int[] receive = new int[n];  
        Stack<Tower> tower = new Stack<>();  
        StringTokenizer st = new StringTokenizer(br.readLine());  
        Tower nextTower;  
  
        for(int idx = 0; idx < n; idx++) {  
             nextTower = new Tower(Integer.parseInt(st.nextToken()), idx + 1);  
  
             while(true) {  
                 //신호를 받아줄 탑이 없으면  
                 if(tower.isEmpty()) {  
                     receive[idx] = 0;  
                     tower.push(nextTower);  
                     break;  
                 }  
                 else {  
                     if(tower.peek().height > nextTower.height) {  
                         receive[idx] = tower.peek().num;  
                         tower.push(nextTower);  
                         break;  
                     }  
                     // 현재 탑의 높이보다 작다면 의미 없으므로 삭제.  
                     else tower.pop();  
                 }  
             }  
        }  
  
        for(int idx : receive) {  
            System.out.print(idx + " ");  
        }  
    }  
}

굳이 Tower 클래스 안하고 앞선 타워의 인덱스를 기억하는법 없을까? -> 아 다른 사람들은 2개 요소를 가진 int 어레이를 선언했구나! 첫번째 요소가 높이고 두번째 요소가 탑 넘버군.

        N = Integer.parseInt(br.readLine());
        Deque<int[]> dq = new ArrayDeque<>();
        dq.addLast(new int[]{100000001, 0});
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i = 1; i <= N; i++) {
            int height = Integer.parseInt(st.nextToken());
            while(dq.peekLast()[0] < height) {
                dq.pollLast();
            }
            System.out.print(dq.peekLast()[1] + " ");
            dq.addLast(new int[]{height, i});
        }

와 이 코드 짠 사람 짱이당 100_000_001 으로 첫요소 초기화해서 이런 코드를 짜다니 ㄷㄷ