BOJ 5430 : AC

·2023년 1월 13일
0

알고리즘 문제 풀이

목록 보기
35/165
post-thumbnail

문제

풀이 과정

요약

RR 마다 뒤집는 과정을 반복하면, 분명 시간초과가 나올거다. RR 의 시간을 효과적으로 줄일 공식이 필요하다.

→ 덱을 활용하면 된다.

상세

  1. 먼저 입력을 받아준다. splsplit() 을 의미한다. 그냥 인덱스로 뽑아도 될 거 같긴 한데 그냥 , 마다 나누어 String[] 으로 받았다.

  2. try catch 를 활용하였다. 덱의 함수인 remove() 를 사용하여 값이 더이상 없음에도 뽑아내려 한다면, catch 코드를 통해 “error” 를 프린트하도록 할 것이다.

  3. 예상 가능한 에러 처리를 먼저 하였다. 입력받은 sp 가 “[]” 로만 되어있고 값을 뽑아내는 “D” 가 하나라도 존재한다면 new Error() 를 호출하여, catch 코드로 이동하게 하였다.

정답

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayDeque;
import java.util.Deque;

public class Main {
    static int T, n;
    static String p, sp;

    static Deque<String> dq = new ArrayDeque<>();
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        T = Integer.parseInt(br.readLine());

        while (--T >= 0) {
            p = br.readLine();
            n = Integer.parseInt(br.readLine());
            sp = br.readLine();
            try {
                if (sp.charAt(0) == '[' && sp.charAt(1) == ']' && p.contains("D")) {
                    throw new Exception();
                }
                String[] spl = sp.substring(1, sp.length() - 1).split(",");

                for (int i = 0; i < spl.length; i++) dq.add(spl[i]);

                boolean isF = true;
                for (int i = 0; i < p.length(); i++) {
                    char tsp = p.charAt(i);
                    if (tsp == 'R') isF = !isF;
                    else {
                        if (isF) dq.removeFirst();
                        else dq.removeLast();
                    }
                }

                if (isF) poll(true);
                else poll(false);

            } catch (Exception e) {
                printError();
            }
        }
        System.out.println(sb.toString());
    }

    private static void poll(boolean check) {
        sb.append("[");
        while (!dq.isEmpty())
            if (dq.size() == 1)
                if(check)
                    sb.append(dq.pollFirst());
                else
                    sb.append(dq.pollLast());
            else
                if(check)
                    sb.append(dq.poll()).append(",");
                else
                    sb.append(dq.pollLast()).append(",");
        sb.append("]\n");
    }

    private static void printError() {
        sb.append("error\n");
    }
}
profile
새로운 것에 관심이 많고, 프로젝트 설계 및 최적화를 좋아합니다.

0개의 댓글