[伯俊2812]拡大(JAVA)


質問する


https://www.acmicpc.net/problem/2812

に答える


スタックはこの問題を解決するために使用できます.現在のスタックの値が入力可能な値以上である場合、pushまたはpupによって解決できます.
削除数:3
数値:1231234
Stack []

  • スタックが空で、すぐにpush
    Stack [1]
    count : 3

  • 2が1より大きいので、1を削除してプッシュします(削除カウント-1)
    Stack [2]
    count : 2

  • 3が2より大きいので、2を削除してプッシュします(削除カウント-1)
    Stack [3]
    count : 1

  • 1が3より小さいので、直接push
    Stack [3, 1]
    count : 1

  • 2が1より大きいので、1を削除してプッシュ(カウントダウン-1を削除)
    Stack [3, 2]
    count : 0

  • countは0なので余剰出力
    answer : 3234
  • コード#コード#

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {
    
        public static void main(String[] args) throws IOException {
    
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringBuilder sb = new StringBuilder();
    
            StringTokenizer st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());
            int K = Integer.parseInt(st.nextToken());
    
            String input = br.readLine();
    
            Stack stack = new Stack(N);
            int count = 0;
            for (int i = 0; i < N; i++) {
                int num = input.charAt(i) - '0';
    
                if (!stack.isEmpty()) {
                    while (!stack.isEmpty() && count < K) {
                        if (stack.peek() < num) {
                            stack.pop();
                            count++;
                        } else {
                            break;
                        }
                    }
                }
    
                stack.push(num);
    
                if (count == K) {
                    sb.append(input.substring(i+1));
                    break;
                }
            }
    
            while (!stack.isEmpty()) {
                int num = stack.pop();
                if (count < K) {
                    count++;
                    continue;
                }
                sb.insert(0, num);
            }
    
            System.out.println(sb);
    
            br.close();
        }
    
        public static class Stack {
            int[] arr;
            int idx;
    
            public Stack(int size) {
                this.arr = new int[size];
            }
    
            public void push(int num) {
                arr[idx++] = num;
            }
    
            public boolean isEmpty() {
                return idx == 0;
            }
    
            public int peek() {
                return arr[idx -1];
            }
    
            public int pop() {
                return arr[--idx];
            }
        }
    }