[백준]5430 AC java

Bong2·2024년 7월 29일
0

알고리즘

목록 보기
53/63

문제 - AC

문제접근

처음에는 [2,1,3,4,5]의 배열을 정수만 추출하여 ArrayList로 넣었다. 그러면서 R인 경우에는 직접 Collections.reverse를 해주면서 뒤집고 D인 경우에는 첫번째 인덱스를 제거하는 식으로 코드를 짰다. 하지만 결과를 보니 16퍼정도에서 시간초과가 나는 걸 확인하고 시간을 줄이는 방법을 좀더 고민을 했다.

  1. Deque를 사용하면 논리적으로 뒤집기가 가능해지기 때문에 이를 활용했다.
  2. StringBuilder를 활용하여 출력될 값들을 저장해서 보여주었다.
  • 문자열내에서 정수만 추출하는 코드

    String sr[] = arr.substring(1, arr.length() - 1).split(",");

다른 해설지를 보니 StringTokenier와 정규표현식을 이용한 것을 확인했는데 이는 다음번에 생각이 잘안날 수 도 있으니 편한 걸로 사용할 것이다.

소스 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) throws  Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int T = Integer.parseInt(st.nextToken());

        for(int t=0;t<T;t++) {
            String s = br.readLine();
            int n = Integer.parseInt(br.readLine());
            String arr = br.readLine();

            Deque<String> deque = new ArrayDeque<>();

            if (n > 0) {
                String sr[] = arr.substring(1, arr.length() - 1).split(",");
                for (String ss : sr)
                    deque.add(ss);
            }
            //물리적으로 뒤집지 않고 논리적으로만 뒤집기
            boolean reverse = false;
            boolean error = false;

            StringBuilder sb = new StringBuilder();
            //R : 뒤집기 D : 버리기
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (c == 'R') {
                    reverse = !reverse;
                } else {
                    if (deque.isEmpty()) {
                        //배열이 비어있는 경우 에러
                        error = true;
                        break;
                    }

                    if (reverse) {
                        deque.removeLast();
                    } else {
                        deque.removeFirst();
                    }

                }
            }

            if (error) {
                System.out.println("error");
            } else {
                sb.append("[");
                while (!deque.isEmpty()) {
                    if (reverse) {
                        sb.append(deque.removeLast());
                    } else {
                        sb.append(deque.removeFirst());
                    }

                    if (!deque.isEmpty())
                        sb.append(",");
                }
                sb.append("]");
                System.out.println(sb.toString());
            }


        }
    }
}
profile
자바 백엔드 개발자로 성장하자

0개의 댓글