[BOJ] 5430 AC.java
1.문제
2.코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
/**
* Author : YoungSeo Jeon
* Date : 2021-08-29
* Description : 백준 5430
*/
public class Main{
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//tc
int T = Integer.parseInt(br.readLine());
out : for(int t=0; t<T; t++) {
//뒤집어졌는지 여부
boolean R = false;
//수행 순서
StringBuilder sb = new StringBuilder(br.readLine());
//배열 길이
int N = Integer.parseInt(br.readLine())+1;
//배열 받아와서 [] 자르고 ,로 구분하여 저장
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str.substring(1,str.length()-1), ",");
int[] arr = new int[N];
//입력
for(int i=1; i<N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
//속도 줄이기 위해 Arrays.remove()사용하지 않고 범위 표현
int start = 1;
int end = N-1;
int curr = 0;
while(sb.length() != curr) {
char func = sb.charAt(curr);
curr++;
//뒤집어졌는지 여부
if(func=='R') {
if(R) R=false;
else R=true;
continue;
}
//뒤집어졌는지에따라 앞과 뒤중 하나를 줄여준다
if(func=='D') {
//길이가 -가 되면 error출력하고 continue;
if(start > end) {
bw.write("error\n");
continue out;
}
if(R) {
end--;
}else {
start++;
}
}
}
//출력 부분
bw.write("[");
if(R) {//뒤부터 출력
for(int i=end; i>start; i--) {
bw.write(arr[i]+",");
}
if(end < start) {
bw.write("]\n");
}else {
bw.write(arr[start]+"]\n");
}
}else {//앞부터 출력
for(int i=start; i<end; i++) {
bw.write(arr[i]+",");
}
if(end < start) {
bw.write("]\n");
}else {
bw.write(arr[end]+"]\n");
}
}
}
bw.flush();
bw.close();
br.close();
}
}
3.Review
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
/**
* Author : YoungSeo Jeon
* Date : 2021-08-29
* Description : 백준 5430
*/
public class Main{
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//tc
int T = Integer.parseInt(br.readLine());
out : for(int t=0; t<T; t++) {
//뒤집어졌는지 여부
boolean R = false;
//수행 순서
StringBuilder sb = new StringBuilder(br.readLine());
//배열 길이
int N = Integer.parseInt(br.readLine())+1;
//배열 받아와서 [] 자르고 ,로 구분하여 저장
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str.substring(1,str.length()-1), ",");
int[] arr = new int[N];
//입력
for(int i=1; i<N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
//속도 줄이기 위해 Arrays.remove()사용하지 않고 범위 표현
int start = 1;
int end = N-1;
int curr = 0;
while(sb.length() != curr) {
char func = sb.charAt(curr);
curr++;
//뒤집어졌는지 여부
if(func=='R') {
if(R) R=false;
else R=true;
continue;
}
//뒤집어졌는지에따라 앞과 뒤중 하나를 줄여준다
if(func=='D') {
//길이가 -가 되면 error출력하고 continue;
if(start > end) {
bw.write("error\n");
continue out;
}
if(R) {
end--;
}else {
start++;
}
}
}
//출력 부분
bw.write("[");
if(R) {//뒤부터 출력
for(int i=end; i>start; i--) {
bw.write(arr[i]+",");
}
if(end < start) {
bw.write("]\n");
}else {
bw.write(arr[start]+"]\n");
}
}else {//앞부터 출력
for(int i=start; i<end; i++) {
bw.write(arr[i]+",");
}
if(end < start) {
bw.write("]\n");
}else {
bw.write(arr[end]+"]\n");
}
}
}
bw.flush();
bw.close();
br.close();
}
}
처음에 뒤집는 부분은 R로 표시하려고 생각했는데 Arrays.remove()까지 다른방법으로 시간을 줄일 수 있다는 것이 나중에 생각났다.
100%에서 시간초과가 나서 찾아보니 Arrays.remove()는 O(n)의 시간복잡도를 가진다고 해서 D함수 부분과 함수 출력부분을 start와 end 변수를 만들어서 관리해주었다.
Author And Source
이 문제에 관하여([BOJ] 5430 AC.java), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hakka_ame/BOJ-5430-AC.java저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)