AC

곽지욱·2024년 6월 12일

BOJ

목록 보기
60/69

백준 5430번 :AC

  • 처음엔 숫자 원소를 덱에 넣고 D연산을 할 때마다 통째로 뒤집는 방법을 생각했다가 실패했다.

  • Deque를 활용하고자 했다 -> 양방향에서 접근이 가능하니깐..

  • pollFirst() or pollLast()

  • boolean 자료형을 잘 안쓰는 버릇이 있다보니 활용을 잘 못하는 듯..

  • 그 다음으로 고려해야 할 것은 에러처리 -> D 연산을 할 때마다 size확인

  • 입력 형식에 대괄호하고 , 가 포함되어 있기 때문에 StringTokenizer로 문자열을 분리함

  • 찾아보니 split()으로 분리하는 방법도 있었고, 해당 방식이 권장되고 있었음


			 *  만약 split()을 사용하고싶은 경우 정규식으로는
			 *  String input = br.readLine();
			 *  String[] s = input.subString(1, input.length - 1).split(","); 을 해주어야 한다.
  • 우선 subString 으로 문자열을 잘라주는데, 1부터~length -1 을 해줌으로써 대괄호는 아예 배제하고 .split 조건추가..

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.StringTokenizer;

public class AC {

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

        //백준 5430번
        ArrayDeque<Integer> deque;
        StringTokenizer st;

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

        while(T --> 0){

            String command = br.readLine(); //명령어

            int n = Integer.parseInt(br.readLine());

            st = new StringTokenizer(br.readLine(),"[],");

            deque = new ArrayDeque<Integer>();

            for(int i = 0; i<n; i++){
                deque.add(Integer.parseInt(st.nextToken()));
            }

            ACC(command,deque);


        }
        System.out.println(sb);



    }

    public static void ACC(String command, ArrayDeque<Integer> deque) {
        boolean isRight = true;

        for(char cmd : command.toCharArray()){

            if(cmd =='R'){
                isRight = !isRight;
                continue;
            }

            //D의 경우
            //D함수이면서 방향을 바꾼적 없을 때
            if(isRight){
                //원소가 비어있을 경우 error를 출력하고 함수 종료
                if (deque.pollFirst() == null){
                    sb.append("error\n");
                    return;
                }
            }
            else{ //D 함수이면서 방향을 바꿨을 때

                if(deque.pollLast() == null){
                    sb.append("error\n");
                    return;
                }

            }

        }

        //모든 함수가 정상적으로 작동했다면 덱에 남아있는 요소들을 출력문으로

        MakePrint(deque,isRight);

    }

    public static void MakePrint(ArrayDeque<Integer> deque, boolean isRight) {

        sb.append('['); //우선 여는 대괄호 먼저 저장

        if(deque.size() > 0){ //출력할 원소가 한 개 이상 있을 경우

            if(isRight){//정방향일 경우
                sb.append(deque.pollFirst());

                while (!deque.isEmpty()){ //그러고 나서 deque 가 비어있지 않다면,
                    sb.append(',').append(deque.pollFirst());
                }

            }
            else{ //역방향일 경우

                sb.append(deque.pollLast());

                while(!deque.isEmpty()){
                    sb.append(',').append(deque.pollLast());
                }

            }

        }

        sb.append(']').append('\n'); //닫는 대괄호 및 개행


    }


}
  • 처음엔 사용자가 R을 계속 입력할 경우 계속 앞뒤가 바뀌어야 하는거 아닌가? 해서 해맸는데 그런 경우는 배제한듯..

0개의 댓글