白駿-2493:タワー[ジャワ]


  • 日直線上にN個の異なる高さの塔を水平直線の左から右に順に立てた.
    2.各タワーにレーザエミッタ
  • を取り付ける
  • すべてのタワー上のレーザエミッタは、地表に平行な水平直線の左側にレーザ信号を送信する.
    4.タワーは全てレーザ信号受信装置
  • が装着.
  • が1つのタワーから送信レーザ信号は、第1のタワーからのみ
  • しか受信できない.
    import java.io.*;
    import java.util.*;
    
    public class Main {
    	public static void main(String[] args) throws NumberFormatException, IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringBuilder sb = new StringBuilder();
    		int N = Integer.parseInt(br.readLine()); // 탑 개수
    
    		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    		ArrayDeque<Integer> stack = new ArrayDeque<>(); // 탑 담을 스택
    		ArrayDeque<Integer> index = new ArrayDeque<>(); // 현재 탑의 인덱스 담을 스택
    
    		for (int i = 1; i <= N; i++) {
    			int n = Integer.parseInt(st.nextToken()); // 탑 높이 하나씩 읽기
    			if (stack.isEmpty()) { // 스택이 비어있다면
    				sb.append("0 "); // 레이저를 받을 곳이 없으니 0
    				stack.push(n); // 현재 탑 넣기
    				index.push(i); // 현재 탑의 인덱스 넣기
    			} else {// 스택이 비어있지 않다면
    				while (true) { //
    					if (stack.isEmpty()) { // 스택이 비어있다면 위와 같음
    						sb.append("0 ");
    						stack.push(n);
    						index.push(i);
    						break; // 멈추기
    					}
    					if (stack.peek() > n) { // 바로 앞의 탑이 현재 탑의 높이보다 높다면
    						sb.append(index.peek()).append(" ");// 그 인덱스 출력
    						stack.push(n); // 현재 탑 넣기
    						index.push(i); // 현재 탑의 인덱스 넣기
    						break;
    					} else { // 바로 앞의 탑이 현재 탑의 높이보다 낮다면 앞의 탑에 도달할 일이 없으니
    						stack.pop(); // 탑 없애기
    						index.pop(); // 그 탑의 인덱스도 없애기
    					}
    				}
    			}
    			// sb.append("0 ");
    		}
    		System.out.println(sb);
    		br.close();
    	}
    }