코딩가딩가

[JAVA]BOJ 5430, AC

Noooodle 2024. 8. 21. 16:13

deque를 활용한 문제이다. 그리고 출력시에 주의가 좀 필요하다.

 

R이 들어왔을때 뒤집어야하는데, 진짜로 뒤집는게 아니라 deque에서 뒷부분(last)를 보면 된다. 뒤집은 것처럼 보이게한다.

나는 flag를 이용해서 뒤에를 봐야할 때를 표시했다. RR <- 이렇게 들어오면 두 번 뒤집어서 결국 뒤집지 않은 상태와 같다. flag는 처음에 0이고 flag=1 은 뒤에를 봐야한다는 표시이다.

switch (p.charAt(i)) {
                case 'R':
                    flag = flag == 0 ? 1 : 0;
                    break;

                case 'D':
                    if (deque.isEmpty()){
                        System.out.println("error");
                        return;
                    }
                    else{
                        if(flag == 1)
                            deque.pollLast();
                        else
                            deque.poll();
                    }
                    break;
            }

 

출력시 주의사항은.. 비었을때 D를 하면 error발생이지만 비어있는 상태는 error가 아니라는 것이다. size가 0이고 빈 deque가 R를 한 뒤 출력결과는 [] 이어야 한다. 빈 상태도 error 처리를 했다가 두 번이나 오답처리를 받았다. deque를 만들때 n > 0 인 경우에만 deque를 만들고 아닐때(n==0)는 그냥 아무것도 안하게 처리했다. 

 

또 주의사항?은, 내가 아직 자바 문법에 익숙하지 않아서 생긴 일이다. [1,23,4] 이런식으로 들어온 입력을 1 23 4 로 떼는게 익숙하지 않았다..ㅎㅎ String은 메소드도 많고 charAt은 한 글자고.,. 하니까 더 어렵게 느껴진다. 하다보면 적응이 되는 날이 오겠지

String[] xArr = x.replaceAll("[\\[\\]]", "").split(","); // 대괄호 빼고 숫자있는 String 배열 만들기

 


아래는 전체 코드이다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;

public class BOJ5430 {
    public static void AC(String p, int n, String x) {
        int i, flag = 0, size;
        Deque<Integer> deque = new LinkedList<>();

        if (n > 0) { // 비었을때 예외 처리
            String[] xArr = x.replaceAll("[\\[\\]]", "").split(","); // 대괄호 빼고 숫자있는 String 배열 만들기
            for (i = 0; i < n; i++) {
                deque.add(Integer.parseInt(xArr[i]));
            }
        }

        for (i = 0; i < p.length(); i++) {
            switch (p.charAt(i)) {
                case 'R':
                    flag = flag == 0 ? 1 : 0;
                    break;

                case 'D':
                    if (deque.isEmpty()){
                        System.out.println("error");
                        return;
                    }
                    else{
                        if(flag == 1)
                            deque.pollLast();
                        else
                            deque.poll();
                    }
                    break;
            }
        }

        size = deque.size();
        System.out.print("[");
        for(i=1;i<size;i++){
            if(flag == 1)
                System.out.print(deque.pollLast()+",");
            else
                System.out.print(deque.pollFirst()+",");
        }
        if(size != 0)
            System.out.print(deque.poll());
        System.out.println("]");

    }

    public static void main (String[]args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int i, T, n;
        String p, x;

        T = Integer.parseInt(br.readLine());

        for (i = 0; i < T; i++) {
            p = br.readLine();
            n = Integer.parseInt(br.readLine());
            x = br.readLine();
            AC(p, n, x);
        }
    }
}

'코딩가딩가' 카테고리의 다른 글

[JAVA]BOJ 10799, 쇠막대기  (0) 2024.08.25
[JAVA]BOJ 4949, 균형잡힌 세상  (0) 2024.08.25
[JAVA]BOJ 10866, 덱  (0) 2024.08.20
[JAVA]BOJ 1966, 프린터 큐  (0) 2024.08.19
[JAVA]BOJ 10845, 큐  (0) 2024.08.18