ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐Ÿšฉ Introduction
์Šคํ„ฐ๋”” ์ค‘ ์ฝ”ํ…Œ์— ๊ฐ€๋” ๋“ฑ์žฅํ•˜๋Š” ์œ ํ˜•์ธ ์›น ๋ธŒ๋ผ์šฐ์ € ํƒ์ƒ‰ ๋ฌธ์ œ๋ฅผ ํ’€๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ตฌ๊ธ€๋ง์„ ํ•ด๋„ ๋‹ต์ด ๋งŽ์ง€ ์•Š๊ณ , ํ‘ผ ์‚ฌ๋žŒ๋„ ์ ์€ ๋ฌธ์ œ๋ผ ๋„์›€์ด ๋ ๊นŒ ์‹ถ์–ด ์˜ฌ๋ฆฐ๋‹ค.

๐Ÿ“Œ ๋ฌธ์ œ

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

 

23294๋ฒˆ: ์›น ๋ธŒ๋ผ์šฐ์ € 1

์ฒซ์งธ ์ค„์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋Š” ์›นํŽ˜์ด์ง€์˜ ์ข…๋ฅ˜์˜ ์ˆ˜ N, ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ๊ฐœ์ˆ˜ Q ์™€ ์ตœ๋Œ€ ์บ์‹œ ์šฉ๋Ÿ‰ C ์ด ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค.(1 ≤ N, Q ≤ 2,000, 1 ≤ C ≤ 200,000) ๋‘˜์งธ ์ค„์—๋Š” N๊ฐœ์˜ ์ •์ˆ˜ CAPi

www.acmicpc.net

๐Ÿ“ ์„ค๋ช…

๊ฐ„๋‹จํžˆ ๋’ค๋กœ ๊ฐ€๊ธฐ์™€ ์•ž์œผ๋กœ ๊ฐ€๊ธฐ์— ์žˆ๋Š” ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋“ค์„ ๊ฐ๊ฐ Deque ๊ณผ Stack ์— ๋„ฃ์–ด์„œ ํ’€์—ˆ๋‹ค. volume ์ด๋ผ๋Š” ๋ณ€์ˆ˜๋กœ ํ˜„์žฌ ์‚ฌ์šฉ๋˜๋Š” ์บ์‹œ ์šฉ๋Ÿ‰์„ ๊ณ„์† ์ถ”์ ํ•˜๊ณ , ์ด ๊ฐ’์ด max (๋ฌธ์ œ์—์„œ๋Š” C) ๋ฅผ ๋„˜์–ด์„œ๋ฉด Deque ์˜ removeFirst ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ๊ฐ€์žฅ ์˜ˆ์ „์— ๋ฐฉ๋ฌธํ•œ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ฑฐํ•ด์ค€๋‹ค. ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค Stack ์€ clear() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋น„์›Œ์ฃผ๊ณ , ๋น„์›Œ์ง„ ๋งŒํผ ์šฉ๋Ÿ‰์„ ๊ณ„์‚ฐํ•ด volume ์—์„œ ๋นผ ์ฃผ์—ˆ๋‹ค.

 

1. ์ฒ˜์Œ์— ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ ๋ฌด์‹ฌ์ฝ” toCharArray() ๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, A i (ํŽ˜์ด์ง€ ์ ‘๊ทผ ๋ช…๋ น) ์„ ์ €์žฅํ•œ char ๋ฐฐ์—ด์—์„œ 2๋ฒˆ์งธ๋ฅผ ์ ‘๊ทผํ•˜๋‹ˆ๊นŒ ๊ณต๋ฐฑ ๋ฌธ์ž๊ฐ€ ๋‚˜์™€ ๋ฌธ์ œ๊ฐ€ ํ’€๋ฆฌ์ง€ ์•Š์•˜๋‹ค. ์ดํ›„์— StringTokenizer ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž…๋ ฅ์„ ๋ฐ›๋„๋ก ๋ณ€๊ฒฝํ•ด์ฃผ์–ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
2. Stack ๊ณผ Deque ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์›์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ๋ชจ๋‘ ArrayList ํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ”์ค€ ๋’ค์— ์ธ๋ฑ์Šค๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์›์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•ด์•ผ ํ–ˆ๋‹ค. ์ถœ๋ ฅ์„ ํ•  ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ArrayList๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค์— ๋งจ ๋’ค์˜ ์›์†Œ๋ถ€ํ„ฐ (๊ฐ€์žฅ ์ตœ๊ทผ์— ๋ฐฉ๋ฌธํ•œ ์ˆœ) ์ถœ๋ ฅํ•˜๋„๋ก ํ–ˆ๋‹ค.

๐Ÿ’ก ํ’€์ด

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {

  static Deque<Integer> past;
  static Stack<Integer> rollback;
  static int volume = 0;
  static int current = -1;
  static int[] sizes;
  static int max;

  public static void goBackward() {
    if (past.isEmpty()) {
      return;
    }

    rollback.push(current);
    current = past.removeLast();
  }

  public static void goFrontward() {
    if (rollback.isEmpty()) {
      return;
    }

    past.addLast(current);

    current = rollback.pop();
  }

  public static void access(int target) {
    if (current != -1) {
      past.addLast(current);
    }

    if (!rollback.isEmpty()) {
      int total = 0;
      for (int r : rollback) {
        total += sizes[r];
      }
      volume -= total;
      rollback.clear();
    }

    current = target;
    volume += sizes[target];

    if (volume > max) {
      while (volume > max && !past.isEmpty()) {
        volume -= sizes[past.getFirst()];
        past.removeFirst();
      }
    }

  }

  public static void compress() {
    int cur = -1;
    List<Integer> p = new ArrayList<>(past);
    for (int i = 0; i < p.size(); i++) {
      if (cur != -1 && cur == p.get(i)) {
        while (i < p.size() && p.get(i) >= 0 && cur == p.get(i)) {
          volume -= sizes[p.get(i)];
          p.set(i, -1);
          i++;
        }
//        p.set(i-1, cur);
      }
      if (i < p.size()) {
        cur = p.get(i);
      }
    }
    int n = 0;
    while (p.contains(-1)) {
      if (p.get(n) == -1) {
        p.remove(n);
        continue;
      }
      n++;
    }
    past = new LinkedList<>(p);
  }

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    int N = Integer.valueOf(st.nextToken());
    int Q = Integer.valueOf(st.nextToken());
    max = Integer.valueOf(st.nextToken());

    sizes = new int[N + 1];

    st = new StringTokenizer(br.readLine(), " ");

    for (int i = 1; i <= N; i++) {
      sizes[i] = Integer.valueOf(st.nextToken());
    }

    past = new LinkedList<>();
    rollback = new Stack<>();

    for (int i = 0; i < Q; i++) {
      st = new StringTokenizer(br.readLine(), " ");
      String command1 = st.nextToken();
      String command2 = "";
      if (st.hasMoreTokens()) {
        command2 = st.nextToken();
      }

      if (command1.equals("B")) {
        goBackward();
      }

      if (command1.equals("F")) {
        goFrontward();
      }

      if (command1.equals("A")) {
        access(Integer.valueOf(command2));
      }

      if (command1.equals("C")) {
        compress();
      }
    }

    System.out.println(current);

    StringBuilder sb1 = new StringBuilder();
    if (past.isEmpty()) {
      System.out.println(-1);
    } else {
      List<Integer> p = new ArrayList<>(past);
      for (int i = p.size() - 1; i >= 0; i--) {
        if (i == 0) {
          sb1.append(p.get(i));
        } else {
          sb1.append(p.get(i) + " ");
        }
      }
      System.out.println(sb1);
    }

    StringBuilder sb2 = new StringBuilder();
    if (rollback.isEmpty()) {
      System.out.print(-1);
    } else {
      List<Integer> r = new ArrayList<>(rollback);
      for (int i = r.size()-1; i >= 0; i--) {
        if (i == 0) {
          sb2.append(r.get(i));
        } else {
          sb2.append(r.get(i) + " ");
        }
      }
      System.out.print(sb2);
    }

  }

}
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2024/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ