본문 바로가기
Coding Test

[백준] 5430 AC - 자바 Java

by 쌩욱 2021. 11. 29.

 

https://www.acmicpc.net/problem/5430

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

 

풀이

아무 생각 없이 풀면 시간초과가 나는 문제다.. reverse함수를 썼다가 처음에 틀렸다.

배열을 뒤집을 때 진짜 뒤집지 말고 덱 자료구조와 어디가 앞인지 기록하며 풀이해야한다.

 

숫자 배열을 입력받을 때 [1,2,3] 이런 식으로 입력이 들어오므로

substring 함수를 사용해 [ ] 문자를 잘라내고 split(',') 함수를 사용해 숫자를 가져온다.

arrStr = br.readLine();
arrStr = arrStr.substring(1, arrStr.length()-1);
String[] split = arrStr.split(",");

for(int i=0; i<n; i++){
arr.add(Integer.parseInt(split[i]));
}

 

1. 덱에 숫자들을 순서대로 넣는다. / 덱의 방향이 오른쪽으로 간다는 의미의 변수를 생성한다. (boolean isRight = true)

 

2. 함수 문자열을 차례대로 확인한다.

   2-1. 'R'이면 덱의 방향을 반대로 바꾼다. (isRight != isRight)

   2-2. 'D'이면 덱이 비었는지 확인하고 비었으면 에러이므로 반복문을 빠져나온다.

   2-3. 덱의 방향이 오른쪽이면 덱의 첫 번째 요소를 제거한다. (removeFirst)

   2-4. 덱의 방향이 왼쪽이면 덱의 마지막 요소를 제거한다. (removeLast)

 

3. 에러 발생 시 'error'를 출력한다.

 

4. 에러가 아닐 시 StringBuilder를 통해 방향에 맞게 출력문을 만들어 출력한다.

 

전체 코드

package 구현;

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

public class BOJ_5430_AC {
    public static int T, n;
    public static String func, arrStr;
    public static ArrayDeque<Integer> arr;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        T = Integer.parseInt(br.readLine());
        for(int t=0; t<T; t++){
            func = br.readLine();
            n = Integer.parseInt(br.readLine());
            arr = new ArrayDeque<>();
            boolean isRight = true;
            boolean isError = false;
            arrStr = br.readLine();
            arrStr = arrStr.substring(1, arrStr.length()-1);
            String[] split = arrStr.split(",");

            for(int i=0; i<n; i++){
                arr.add(Integer.parseInt(split[i]));
            }

            for(int i=0; i<func.length(); i++){
                if(func.charAt(i) == 'R'){
                    isRight = !isRight;
                }else{
                    if(arr.isEmpty()){
                        isError = true;
                        break;
                    }

                    if(isRight){
                        arr.removeFirst();
                    }else{
                        arr.removeLast();
                    }
                }
            }

            if(!isError){
                if(isRight){
                    StringBuilder sb = new StringBuilder();
                    sb.append('[');
                    if(arr.isEmpty()){

                    }
                    else{
                        sb.append(arr.pollFirst());
                        while(!arr.isEmpty()){
                            sb.append(',');
                            sb.append(arr.pollFirst());
                        }
                    }

                    sb.append(']');
                    System.out.println(sb.toString());
                }else{
                    StringBuilder sb = new StringBuilder();
                    sb.append('[');
                    if(arr.isEmpty()){

                    }
                    else{
                        sb.append(arr.pollLast());
                        while(!arr.isEmpty()){
                            sb.append(',');
                            sb.append(arr.pollLast());
                        }
                    }
                    sb.append(']');
                    System.out.println(sb.toString());
                }
            }
            else{
                System.out.println("error");
            }
        }
    }
}