[백준] AC 5430번

나의 풀이

public class AC {
    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());

        while(T-- != 0) {
            String function = br.readLine();
            int N = Integer.parseInt(br.readLine());
            String[] items = br.readLine().replaceAll("[\\[\\]]", "").split(",");
            LinkedList<Integer> nums = new LinkedList<>();
            for(String item : items) {
                if(!item.equals("")) {
                    nums.add(Integer.parseInt(item));
                }
            }

            boolean isError = false;
            int rev = 0;
            for(int j = 0; j < function.length(); j++) {
                char p = function.charAt(j);
                if(p == 'R') {
                    rev++;
                    continue;
                } else if(p == 'D' && !nums.isEmpty()) {
                    if(rev % 2 == 0) {
                        nums.pollFirst();
                    } else {
                        nums.pollLast();
                    }
                } else {
                    sb.append("error").append("\n");
                    isError = true;
                    break;
                }
            }

            if(isError) {
                continue;
            } else {
                if(!nums.isEmpty()) {
                    if(rev % 2 == 1) {
                        Collections.reverse(nums);
                    }
                    sb.append("[").append(nums.pollFirst());
                    while(!nums.isEmpty()) {
                        sb.append(',').append(nums.pollFirst());
                    }
                    sb.append(']').append('\n');
                } else {
                    sb.append("[]").append('\n');
                }
            }

        }
        System.out.println(sb);
    }
}
  • T번을 반복한다.
  • 함수와 수의 개수, 정수를 받아준다.
  • 정수는 [10,20] 이런 식으로 입력된다. 때문에 replaceAll 에 괄호를 찾아내는 정규식을 대입하여 "" 로 바꿔주면 -> 10,20. 이 형태에서 다시 ',' 를 기준으로 잘라주었다. ->String[] == [10, 20]
  • 그리고 해당 숫자는 현재 String 형태이기 때문에, 숫자로 바꿔서 링크드 리스트에 넣어준다. 단, 빈 값이 들어올 수 있기 때문에 빈 문자열을 체크해준다.
  • 이제 함수를 체크하면서 함수가 R 인 경우에는 뒤집기를, D 인 경우에는 하나씩 잘라줘야 한다.
  • 단, R일 때마다 계속 뒤집으면 오래 걸릴 수 있으니, rev 변수를 두어서 R 이 몇 번 입력됬는지 체크한다.
  • 만약 함수가 D이면서 nums 리스트가 비어있지 않다면, rev 변수를 사용하여 R 이 짝수인지 홀수인지 체크한다. 홀수면 뒤집기를 해줘야 하는데, 이는 뒤집고 앞에서부터 제거하는 것과 뒤에서부터 제거하는 것의 제거대상이 같기 때문에 그냥 뒤에서부터 제거하도록 한다. 짝수면 그냥 앞에서부터 제거한다.
  • 만약 함수가 D인데 nums 리스트가 비어있다면 더 이상 뺄 수 없으므로 error 를 StringBuilder 에 넣어주고 isError 를 true 로 바꿔주고 반복문을 탈출한다.
  • 만약 isError 가 true 라면 continue 를 통해서 다음 연산을 진행하고, 아니라면 nums 리스트가 비어있는지 확인한다. 비어있다면 빈 괄호 [] 를 StringBuilder 에 넣어주고, 아니라면 rev 의 짝, 홀수 여부를 확인하여 홀수면 nums 를 뒤집어준다. 그리고 출력 양식에 맞게 괄호와 컴마를 추가해주면 된다.

0개의 댓글