[백준] 5430번_AC_Java

Shin·2025년 4월 27일

백준

목록 보기
1/11
post-thumbnail

접근

  • 덱을 이용하여 풀어내는 문제
  • 입출력시에 ScannerSystem.out.print를 사용하면 시간 초과가 발생하기 때문에 BufferedReaderStringBuilder를 사용하여 입출력을 수행

풀이

1. 입력

  • [x1,...,xn]형태로 배열이 입력되기 때문에 정규표현식으로 대괄호를 제거하고 콤마(,) 기준으로 문자열을 split한다

2.1 함수 R

  • 함수 R이 시행되면 boolean타입으로 선언한 변수 isReversed를 현재 상태의 반대값으로 저장한다 (isReversed = !isReversed)
  • isReversed값에 따라 결과를 출력할 때 숫자를 뒤집을지 정함

2.2 함수 D

  • 배열에 정수가 없을 때
    👉🏻 에러 출력 후 종료

  • 배열에 정수가 있을 때
    👉🏻 함수 R이 시행된 경우: 덱의 첫 번째 요소 삭제

    👉🏻 함수 R이 시행되지 않은 경우: 덱의 마지막 요소 삭제

      

3. 출력

isReversedtrue 일 때 덱의 마지막 요소부터 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 해당 문제를 풀어보며 처음 사용해 봤다.
BufferedReaderStrigBuilder에 대한 공부가 필요하며 왜 ScannerSystem.out.print를 사용하면 시간 초과가 나는지에 대한 공부 또한 필요함을 느꼈다.

0개의 댓글