[伯俊](Java)5430-AC
15971 ワード
質問リンク
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;
}
}
Reference
この問題について([伯俊](Java)5430-AC), 我々は、より多くの情報をここで見つけました https://velog.io/@courage331/백준Java-5430-ACテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol