백준 - JAVA/큐, 덱

[백준] 5430번AC _ JAVA ( 주석 설명 )

wch_s 2023. 3. 28. 12:01

풀이

1)
주어지는 함수가 R(뒤집기), D(삭제) 이므로, 주어진 자료구조를 읽어나가는 시점(처음, 끝)을 설정하는 게 중요하다. => deque 사용

start_point : true → 앞

start_point : false → 뒤


2)
'R' 이면 start_point 를 뒤집어주고,

'D' 이면 start_point 에 따라 pollFirst(), pollLast()를 한다.

- 이 때, poll() 한 값이 null 이면 error 이다.


3)
deque의 원소가 0개이더라도, "[]" 와 같이 출력을 해주어야 한다.

(공백으로 출력했다가, 계속 틀렸다..)



+
입력을 받을 때 [1,2,3,4,5] 형식으로 입력을 받는데

구분하려는 문자열을 StringTokenizer("[],") 한 번에 넘겨주면 된다.

"],[" 와 같이 순서 상관없이 넣어줘도 된다.
+

 

코드

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


public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int T = Integer.parseInt(br.readLine());
        for(int i=0;i<T;++i){
            String function = br.readLine(); //수행할 함수
            int n = Integer.parseInt(br.readLine());//배열에 들어있는 수의 개수

            StringTokenizer st = new StringTokenizer(br.readLine(), "[],");
            //Deque에 입력받은 배열의 정수를 넣는 과정
            Deque<Integer> deque = new LinkedList<>();
            for(int j=0;j<n;++j){
                deque.addLast(Integer.parseInt(st.nextToken()));
            }

            //deque을 읽어나가는 시작 지점
            //true : 앞에서부터
            //flase : 뒤에서부터
            boolean start_point = true;
            boolean isError = false;

            //함수를 수행하는 과정
            //R(뒤집기), D(버리기)
            for(int j=0;j<function.length();++j){
                if('R' == function.charAt(j)){
                    start_point = !start_point;
                }
                else{
                    if(deque.isEmpty()){ //덱이 비어있으면
                        isError = true;
                        break;
                    }
                    else{ //덱에 원소가 들어있으면
                        if(start_point){ //deque을 읽어나가는 시작 지점이 true이면
                            deque.pollFirst();
                        }
                        else{
                            deque.pollLast();
                        }
                    }
                }
            }

            //함수 수행이 끝나고 출력 형태 만들기
            //빈 deque에서 D를 해서 error가 된 경우
            if(isError){
                sb.append("error").append('\n');
            }

            else {
                sb.append("[");
                //deque에 값이 있으면, D로 인한 null 체크
                if(!deque.isEmpty()) {
                    if (start_point) { //deque을 읽어나가는 시작 지점이 true이면
                        Integer num = deque.pollFirst();
                        sb.append(num);
                        while (!deque.isEmpty()) {
                            sb.append(',').append(deque.pollFirst());
                        }
                    } else {
                        Integer num = deque.pollLast();
                        sb.append(num);
                        while (!deque.isEmpty()) {
                            sb.append(',').append(deque.pollLast());
                        }
                    }
                }
                sb.append("]").append('\n');
            }
        }
        System.out.println(sb);
    }
}