자료구조_알고리즘/코딩테스트

[백준/JAVA] 5430번 AC / 데크, 자료구조

HSRyuuu 2023. 6. 7. 22:56

문제

테스트케이스

첫째줄 (4) : 테스트 케이스 개수

각 테스트 케이스

  1. R과 D로 이루어진 명령어
  2. 배열의 길이
  3. 배열(문자열로 주어진 배열)

알고리즘 분류

구현, 자료구조, 문자열, 파싱, 데크


자료구조 초기화

substring()을 통해 맨 앞에 ' [ ' , '  ] ' 을 잘라내고, ' , '을 구분자로 하여 split(",")으로 문자열을 쪼개주었다.

여기서 주의할 점은 만약 입력받은 배열 String의 길이가 2인 경우 "[ ]" 으로,  해당 연산을 할 경우 오류가 생긴다.

따라서 arrStr.length() > 2 라는 조건을 걸고 deque에 추가해준다.

//arrStr = 입력받은 배열 String
Deque<Integer> deque = new LinkedList<>();
if(arrStr.length() > 2){
    String[] split = arrStr.substring(1,arrStr.length()-1).split(",");
    for (int i=0;i< split.length;i++){
        deque.addLast(Integer.parseInt(split[i]));
    }
}

커맨드 실행

isReverse라는 flag를 통해 지금 배열이 커맨드 R로 인해 reverse 된 상태인지 체크한다.

만약 isReverse = true 라면, 데크에서 pollLast를 이용해서 뒤에서 값을 삭제하고,

isReverse = false 라면, 데크에서 pollFirst를 이용해서 앞에서 값을 삭제한다.

 

만약 데크가 비어있는 상태에서 커맨드 D 가 들어오면 isError flag를 true로 바꿔주고 커맨드 반복문을 종료한다.


 

출력

커맨드 연산을 모두 끝낸 상태에서 isReverse 여부를 확인하여 각 다르게 출력한다.

isReverse = true인 경우 pollLast를 이용하여 뒤에서부터 값을 빼며 출력하고,

isReverse = false인 경우 pollfirst를 이용하여 앞에서부터 값을 빼며 출력한다.

 

출력은 StringBuilder를 이용하는데, public class에 static 변수로 만들어놓은 StringBuilder에 append하고, 마지막에 한번에 출력한다.


주의사항

  • 배열의 크기가 0인 상태에서의 커맨드 명령어 주의
  • 배열의 크기가 0일때 문자열 파싱 주의
  • 마지막에 출력할때, 배열의 크기가 0인 경우 주의

Code

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

public class No5430 {
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
        int N = Integer.parseInt(br.readLine());

        for (int k = 0; k < N; k++) {
            //케이스 시작
            boolean isError = false;
            //입력부
            String cmd = br.readLine();//커맨드
            int n = Integer.parseInt(br.readLine());//배열의 길이
            String arrStr = br.readLine();//배열 문자열
            char[] chars = cmd.toCharArray();

            //배열 만들기
            Deque<Integer> deque = new LinkedList<>();

            if(arrStr.length() > 2){
                String[] split = arrStr.substring(1,arrStr.length()-1).split(",");
                for (int i=0;i< split.length;i++){
                    deque.addLast(Integer.parseInt(split[i]));
                }
            }

            //커맨드 실행
            boolean isReverse = false;
            for(int i=0;i<chars.length;i++){
                char ch = chars[i];
                if(ch == 'R'){
                    if(isReverse){
                        isReverse = false;
                    }else{
                        isReverse = true;
                    }
                }else if(ch == 'D'){
                    if(deque.isEmpty()){
                        isError = true;
                        break;
                    }else if(isReverse){
                        deque.pollLast();
                    }else{
                        deque.pollFirst();
                    }
                }else{
                    isError = true;
                    break;
                }
            }
            if (isError){
                sb.append("error\n");
            }else{
                print(deque,isReverse);
            }
            //케이스 끝
        }
        System.out.println(sb);
    }

    static void print(Deque<Integer> deque, boolean isReverse){

        if(deque.size() == 0){
            sb.append("[]\n");
            return;
        }
        sb.append("[");
        int size = deque.size();
        if(isReverse){
            for(int i=0;i<size-1;i++){
                sb.append(deque.pollLast()).append(",");
            }
        }else{
            for(int i=0;i<size-1;i++){
                sb.append(deque.pollFirst()).append(",");
            }
        }
        sb.append(deque.poll()+"]\n");
    }

}
반응형