Scanner와 System.out.print를 사용하면 시간 초과가 발생하기 때문에 BufferedReader와 StringBuilder를 사용하여 입출력을 수행isReversed = !isReversed)isReversed값에 따라 결과를 출력할 때 숫자를 뒤집을지 정함배열에 정수가 없을 때
👉🏻 에러 출력 후 종료
배열에 정수가 있을 때
👉🏻 함수 R이 시행된 경우: 덱의 첫 번째 요소 삭제
👉🏻 함수 R이 시행되지 않은 경우: 덱의 마지막 요소 삭제
isReversed가 true 일 때 덱의 마지막 요소부터 pop하여 출력하고, false일 때 첫 번째 요소부터 pop하여 출력한다.
덱에 요소가 없을 때까지 while문이 실행 되는데, 이때 while문 안에서 현재 요소가 마지막 요소가 아닐때만 콤마를 붙여 출력 형식을 맞춘다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;
class AC{
private boolean isReversed;
private int t; // 테스트 케이스
private int n; // 배열에 들어 있는 수 개수
private String p; // 수행할 함수
private Deque<Integer> numbers; // 배열 저장
private BufferedReader br;
private StringBuilder sb;
public AC() throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
t = Integer.parseInt(br.readLine()); // 테스트 케이스 입력
}
public int getT() { return t; }
public void inputInfo() throws IOException {
sb = new StringBuilder();
isReversed = false;
p = br.readLine(); // 수행 함수 입력
n = Integer.parseInt(br.readLine()); // 수 개수 입력
numbers = new LinkedList<>();
for (String s: br.readLine().replaceAll("[\\[\\]]", "").split(",")){
if(!s.equals("")){
numbers.add(Integer.parseInt(s));
}
}
}
public void printResult() {
sb.append("[");
while(!numbers.isEmpty()) {
if(isReversed){
sb.append(numbers.removeLast());
}
else if(!isReversed) {
sb.append(numbers.removeFirst());
}
if(!numbers.isEmpty()) {
sb.append(",");
}
}
sb.append("]\n");
System.out.print(sb.toString());
}
public void run() throws IOException {
inputInfo();
for(char c : p.toCharArray()) {
if(c == 'R') {
isReversed = !isReversed;
}
else if (c == 'D' && numbers.size() == 0) { // 리스트에 요소가 없을 때 error
System.out.print("error\n");
return;
}
else if(c == 'D' && numbers.size() > 0 && isReversed == false) { // R이 수행되지 않았을 때 앞 요소를 삭제
numbers.removeFirst();
}
else if(c == 'D' && numbers.size() > 0 && isReversed == true) { // R이 수행됐을 때 뒷 요소 삭제
numbers.removeLast();
}
}
printResult();
}
}
public class Main {
public static void main(String[] args) {
try {
AC ac = new AC();
int testTime = ac.getT();
while (testTime-- > 0) {
ac.run();
}
} catch (IOException e) {
return;
}
}
}
BufferedReader는 가끔 사용해봤지만 StringBuilder 해당 문제를 풀어보며 처음 사용해 봤다.
BufferedReader와 StrigBuilder에 대한 공부가 필요하며 왜 Scanner와 System.out.print를 사용하면 시간 초과가 나는지에 대한 공부 또한 필요함을 느꼈다.