개발하는 두부

[BOJ] 5430.AC (Java)

by 뚜부니

 

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

 

이 문제에서는 테스트케이스 T, 수행할 함수 p, 배열 길이 n, 숫자가 들어간 배열이 입력으로 주어집니다.

p는 'RDD'와 같은 형태로 주어지는데, 여기서 R은 배열 순서를 뒤집고, D는 첫 번째 숫자를 버립니다.

배열이 비어있는데 D를 사용한 경우 에러가 발생합니다.

주어진 정수 배열에 함수 수행 결과를 출력하면 되는데, 에러 발생 시 error를 출력합니다.

 

모든 R에 대해서 배열을 뒤집어가며 수행을 하는 경우 시간초과가 발생하게 됩니다.

시간초과가 발생하지 않게 하려면, R의 상태에 따라 D의 수행 위치를 바꾸어주면 됩니다.

deque을 만들어 숫자를 저장한 후, R이 발생할 때마다 D의 수행위치를 맨 앞, 맨 뒤로 바꾸는 형태로 진행합니다.

 

import java.io.*;
import java.util.ArrayDeque;
import java.util.StringTokenizer;

class Main {

    public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {

        StringTokenizer st;
        ArrayDeque<Integer> deque;

        int T = Integer.parseInt(br.readLine()); // 테스트케이스 수

        while(T-- > 0) {
            String p = br.readLine(); // 수행할 함수
            int n = Integer.parseInt(br.readLine()); // 배열의 길이
            st = new StringTokenizer(br.readLine(), "[],"); // 특정 문자열을 기준으로 나누어 st에 저장

            deque = new ArrayDeque<Integer>(); // 덱 초기화
            for (int i = 0; i < n; i++) { // 덱 생성
                deque.add(Integer.parseInt(st.nextToken()));
            }

            AC(p, deque);

        }

        bw.flush();
        bw.close();
        br.close();

    }

    public static void AC(String command, ArrayDeque<Integer> deque) throws IOException {
        boolean isReverse = false; // 순서 변경 여부 (default : 순서 변경 X의 의미로 false)
        for(char cmd : command.toCharArray()) {
            if (cmd == 'R') {
                isReverse = !isReverse; // 순서 뒤집기
                continue;
            }

            if (cmd == 'D') {
                if (deque.isEmpty()) { // 길이가 0인 경우 수행이 불가능하므로 error 반환
                    bw.write("error\n");
                    return;
                }
                if (isReverse) { // 순서를 뒤집어야 하는 경우
                    deque.pollLast();
                } else { // 순서를 뒤집을 필요가 없는 경우
                    deque.pollFirst();
                }
            }
        }

        // 모든 함수에 대해 정상적으로 수행한 경우 출력문을 만들어야 함

        makePrint(deque, isReverse);

    }

    public static void makePrint(ArrayDeque<Integer> deque,  boolean isReverse) throws IOException {

        bw.write("[");

        if (!deque.isEmpty()) { // deque에 원소가 존재하는 경우

            if (isReverse) { // 순서를 뒤집은 경우
                bw.write(String.valueOf(deque.pollLast()));
                while (!deque.isEmpty()){
                    bw.write("," + String.valueOf(deque.pollLast()));
                }
            }
            else { // 순서를 뒤집지 않은 경우
                bw.write(String.valueOf(deque.pollFirst()));
                while(!deque.isEmpty()) {
                    bw.write("," + String.valueOf(deque.pollFirst()));
                }
            }

        }

        bw.write("]\n");
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 10159.저울 (Java)  (0) 2021.05.02
[BOJ] 1043.거짓말 (Java)  (0) 2021.04.30
[BOJ] 5052.전화번호 목록 (Java)  (0) 2021.04.30
[BOJ] 11720.숫자의 합 (Java)  (0) 2021.04.27
[BOJ] 15685.드래곤커브 (Python)  (0) 2021.04.23

블로그의 정보

개발하는 두부

뚜부니

활동하기