ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준/JAVA] 5430번 AC - Deque, 문자열 파싱
    ETC/Algorithm 2023. 6. 9. 09:28

    문제

    풀이

    자바의 Deque 컬렉션을 사용하여 문제를 풀이하였다.
    문제의 요점인 방향성을 제어하기 위해 way라는 변수를 사용하였고,
    입력값이 [ ] ,(반점) 3개의 특수문자로 감싸져 있기 때문에 StringTokenizer로 문자열을 파싱해줬다.

    코드

    제출 코드

    import java.io.*;
    import java.util.*;
    class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
            // 케이스 개수 T 입력
            int T = Integer.parseInt(br.readLine());
            for (int t = 0; t < T; t++) {
    
                // 함수 배열 cmd 입력
                String cmdLine = br.readLine();
                int cLen = cmdLine.length();
                char[] cmd = new char[cLen];
                for (int i = 0; i < cLen; i++) {
                    cmd[i] = cmdLine.charAt(i);
                }
                // 배열에 들어있는 수 n 입력
                int n = Integer.parseInt(br.readLine());
    
                // 배열을 입력 받을 Deque 타입 선언
                Deque<Integer> dq = new ArrayDeque<>();
    
                // StringTokenizer로 문자열 분리 "[", "]", "," 3개로 분리한다.
                StringTokenizer st = new StringTokenizer(br.readLine(), "[],");
    
                // 정수형태로 Deque에 입력
                for (int i = 0; i < n; i++) {
                    dq.add(Integer.parseInt(st.nextToken()));
                }
    
                // 뒤집기 상태를 관리할 way, true = 앞->뒤
                boolean way = true;
    
                // 에러 상태를 관리할 error, dq가 비어있는데 D를 한번이라도 한 순간 true로 변경
                boolean error = false;
                for (int i = 0; i < cLen; i++) {
                    if (cmd[i] == 'R') {
                        way = !way;
                    } else if (cmd[i] == 'D') {
                        if (!dq.isEmpty()) {
                            if (way) {
                                Integer polled = dq.pollFirst();
                            } else {
                                Integer polled = dq.pollLast();
                            }
                        } else {
                            error = true;
                        }
                    }
                }
    
                // 출력 구현
                if (!error) {
                    // dq에 상태에 따라 뒤집어야하므로, dq를 List로 변환
                    ArrayList<Integer> arr = new ArrayList<>(dq);
    
                    // way의 값에 따라 출력
                    if (way) {
                        bw.write(arr.toString().replace(" ", ""));
                    } else {
                        Collections.reverse(arr);
                        bw.write(arr.toString().replace(" ", ""));
                    }
                } else {
                    bw.write("error");
                }
                bw.write("\n");
                bw.flush();
            }
        }
    }

    공부한 내용

    StringTokenizer

    // StringTokenizer로 문자열 분리 "[", "]", "," 3개로 분리한다.
    StringTokenizer st = new StringTokenizer(br.readLine(), "[],");

    StringTokenizer의 delim에 문자열을 하나씩 입력해주면 알아서 파싱되서 순서대로 가져올 수 있다.

    덱 (Deque)

    자바의 컬렉션 중 하나인 덱은

    pollFirst(), pollLast()를 통해
    poll의 방향을 앞 뒤로 할 수 있다.

    댓글

Designed by black7375.