-

[BOJ - JAVA] 5430 - AC (덱) 본문

백준 문제 풀이

[BOJ - JAVA] 5430 - AC (덱)

흣차 2021. 12. 27. 19:57
728x90
반응형

# 주소

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

 

5430번: AC

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

www.acmicpc.net

# 문제

# 문제 해설 및 코드 리뷰

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        while (n-- > 0) {
            String str = scan.next();
            int num = scan.nextInt();

            String x = scan.next();
            String x_sub[] = x.substring(1, x.length() - 1).split(",");
            Deque<Integer> queue = new LinkedList<>();
            for(int i = 0; i < x_sub.length; i++) {
                if(!x_sub[i].equals(""))
                    queue.offer(Integer.valueOf(x_sub[i]));
            }
            System.out.println(ac(queue, str));
        }
    }
    public static String ac(Deque<Integer> queue, String str){
        boolean reverse = false;
        for (char s : str.toCharArray()) {
            if (s == 'R') {
                reverse = !reverse;
            }
            else{
                if(queue.size() == 0){
                    return "error";
                }
                if (reverse) {
                    queue.removeLast();
                }
                else
                    queue.removeFirst();
            }
        }
        StringBuilder sb = new StringBuilder("[");
        while(!queue.isEmpty()){
            if(reverse)
                sb.append(queue.removeLast());
            else
                sb.append(queue.removeFirst());
            if(queue.size() != 0)
                sb.append(',');
        }
        sb.append(']');
        return sb.toString();
    }
}

이제 척하면 척이어야 합니다.

함수를 새로 만들어서 R이면 함수를 뒤집고, D이면 함수의 첫 번째 배열을 제거하는 문제입니다.

이 문제를 풀때에는 R이 나온다고 해서 함수를 진짜로 뒤집으면 안되고, R이 한 번 나왔을 때는 마지막 원소를 제거하고 짝수번 나왔을 때에는 첫 번째 원소를 제거한다는 이 틀을 기억하셔야합니다.

따라서 R이 나올때마다 reverse라는 boolean타입의 변수를 만들고 계속해서 !reverse를 reverse에 담으면 됩니다.

자 이게 지금까지 핵심 포인트였고 처음부터 문제를 되짚어봅시다.

 

일단 n개의 테스트케이스가 주어지므로 while(n--> 0){으로 입력을 진행해나갑니다.

str와 num을 입력받고 x를 문자열로 입력받습니다.

여기서 str은 함수(RDD라던지 DD라던지)이고 num은 원소 개수, x는 [1,2,3,4]같은 배열을 문자열로 받습니다.

그리고 이것을 저도 이번에 배웠는데, substring이라고 하면 문자열을 자를 수 있습니다.(사실 예전에 배웠지만 잊고있었음)

근데, substring은 인덱스를 지정하여 문자열을 자를 수 있습니다.

따라서 x.substring(1, x,length()-1)이란 것은 x를 1의 위치부터 x.length()-1의 위치까지 slice하겠다는 뜻입니다.

이 잘라진 것을 split(","이라고 입력하면 ,으로 구분해서 x_sub[]에 담겠다는 뜻이 됩니다.

그리고 담긴 x_sub는 배열 형태가 되는데요.

여기서 중요한게, 이 x_sub가 공백이면 안되잖아요.

그래서 x_sub.equals("")가 아닐 때 queue에 담아야 합니다.

면접에서도 가끔 나오는 유형인데, equals와 ==의 차이. 무엇인지 아시겠지요?

equals는 문자열이 같은 것이 있는지 물어보는 거랍니다.

자 그리고 이 queue에 x_sub의 원소를 그냥 담으면 안되고 Integer.valueOf로 형변환을 해서 넣어야 합니다.

이 x_sub[i]의 원소는 현재 String 상태이기 때문에 정수형태로 바꾸어서 생각을 해줍시다.

그리고 이것을 ac라는 메서드에 queue와 str을 넣고 실행합니다.

이후 str각 문자를 toCharArray라고 입력하면 문자열의 배열로 만들어줍니다.

이를 통해 s == R일땐 reverse를 반대로 바꾸는 시도를 합니다.

그리고 D가 들어왔을 땐 현재의 reverse를 참일때와 거짓일때를 나누어, reverse가 참일 땐 배열을 뒤집을 때이므로 제일 뒤의 원소를 제거하고 거짓일 때는 제일 앞에 있는 원소를 제거합니다.

이래서 덱이 편합니다.

덱은 양방향의 데이터 삽입, 삭제, 불러오기 등에 유용합니다.

꼭 알고 계시면 좋겠습니다.

 

음 이후 StringBuilder에 queue의 원소를 차례대로 넣는데, reverse가 참이면 뒤에서부터, false이면 앞의 원소부터 sb에 담고 sb를 toString, 문자열로 변환한 뒤 출력하시면 정답이 됩니다.

감사합니다.

728x90
반응형
Comments