[伯俊](Java)5430-AC


質問リンク


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

問題を解く


久しぶりに解いた質問です.解くのにずいぶん時間がかかった.
Stringを使用すると、新しい文字列を追加するたびに新しいStringが作成され、多くの時間とリソースがかかります.なのでStringBuilderを使いました.
numは0であり,1番目の演算がDの場合,無条件に誤差が生じるという特殊なケースがあるため,単独で処理した.
        if(num==0 && "D".equals(commandLine[0])){
            sb.append("error\n");
            return;
        }
Rが表示されると、idxが反転します.
idxが正数の場合0->n,負数の場合0<-nと方向を移動できる.最小値は最小、最大値は最大です.
Dが現れると、現在のidx方向が正の値の場合、min+、max++を使用して範囲を縮小します.
ただし,配列に要素がない場合,Dが現れるとエラー処理を行う.
for文が終了すると、結果値が生成されることは間違いありません.
先頭と末尾に括弧を付け、idxが正数であれば前から、idxが負数であれば後からsbに値を付けます.

コード#コード#

import java.util.*;

public class Main {

    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            operateAC(sc.next(), sc.nextInt(), sc.next());
        }
        System.out.println(sb);
    }

    public static void operateAC(String command, int num, String array) {

        String[] data = array.replace("[", "").replace("]", "").split(",");
        String[] commandLine = command.split("");
        int idx = 1;
        int min = 0;
        int max = data.length;
        if(num==0 && "D".equals(commandLine[0])){
            sb.append("error\n");
            return;
        }
        for (int i = 0; i < commandLine.length; i++) {
            if ("R".equals(commandLine[i])) {
                idx *=-1;
            } else {
                if (min<max) {
                   if(idx>0){
                       min++;
                   }else{
                       max--;
                   }
                } else {
                    sb.append("error\n");
                    return;
                }
            }
        }

        sb.append("[");
        if (idx > 0) {
            for (int i = min; i <max; i++) {
                if(i!=max-1){
                    sb.append(data[i] + ",");
                }else{
                    sb.append(data[i]);
                }

            }
        } else {
            for (int i = max-1; i >= min; i--) {
                if(i !=min){
                    sb.append(data[i] + ",");
                }else{
                    sb.append(data[i]);
                }
            }
        }
        sb.append("]\n");
        return;
    }
}