[BOJ/2493/Java]タワー


1.問題を理解する


各タワーが右から左にレーザ光を放出すると、最初に到着したタワーの番号出力の問題が発生します.

2.問題分析


左から右へのスタックの管理
  • 現在のインデックスのタワーの高さがhの場合
  • stack.isEmpty()
  • 現在、タワーのレーザー光はどのタワーにも届かない.
  • stack.peek().高さと同様に、タワーのレーザー光はどのタワーにも届かない.
  • 以降、h未満のすべてのタワーサーバのレーザ光がindexのタワーに到達するため、スタックの最上位値が現在のタワー
  • に更新される.
  • stack.peek().高さ>h
  • 現在、タワー上のレーザ光はスタックです.peek()人塔に到着.
  • 3.コード

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Stack;
    import java.util.stream.Stream;
    
    import static java.lang.Integer.parseInt;
    import static java.lang.System.in;
    
    public class Main {
        static int[] heights;
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
    
            int n = st(br.readLine());
    
            heights = Stream.of(br.readLine().split(" "))
                    .mapToInt(Integer::parseInt)
                    .toArray();
    
    
            Stack<Tower> towerStack = new Stack<>();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < n; i++) {
                int h = heights[i];
                while(!towerStack.isEmpty() && towerStack.peek().height < h) {
                    towerStack.pop();
                }
    
                if (towerStack.isEmpty()) {
                    sb.append("0 ");
                } else {
                    sb.append(towerStack.peek().index + " ");
                }
                towerStack.add(new Tower(h, i + 1));
            }
            System.out.println(sb.toString());
        }
    
        public static int st(String str) {
            return parseInt(str);
        }
    
        static class Tower {
            int height;
            int index;
    
            public Tower(int height, int index) {
                this.height = height;
                this.index = index;
            }
        }
    }