[Algorithm Study] 백준 5430

SeokHwan An·2022년 7월 16일
0

문제 출처 : https://www.acmicpc.net/problem/5430

문제 정리

  1. 주어진 명령어를 순서대로 따른다.(R은 뒤집기, D는 삭제하기)
  2. 주어진 숫자 배열의 경우 명령어에 따라 뒤집거나 삭제한다. (단 뒤집기의 경우 숫자 배열을 직접 뒤집는 것이 boolean 변수를 두어 해결한다.)
  3. 숫자 배열이 비어있는 상태에서 D명령어가 실행되면 error를 반환하고 그렇지 않은 경우에는 변경된 숫자 배열을 나타낸다.

위의 문제는 앞과 뒤에서 숫자 배열의 값이 빠져 나갈 수 있는 자료구조인 deque를 쓰는 것이 핵심인 문제였습니다. deque를 활용해 직접 숫자 배열을 뒤집지 않고 앞서 말한 boolean 변수를 두어 뒤집기가 true이면 뒤에서 숫자를 빼고 그렇지 않으면 앞에서 숫자를 빼 불필요한 반복문을 줄일 수 있었습니다.

소스 코드

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

public class Main {
    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());
        for (int i = 0; i < T; i++) {
            String infos = br.readLine();
            int n = Integer.parseInt(br.readLine());
            Deque<Integer> num_arr = new ArrayDeque<>();
            String num = br.readLine();
            String[] numbers = num.substring(1, num.length() - 1).split(",");
            for (String nums : numbers) {
                if (!nums.equals("")) {
                    num_arr.add(Integer.parseInt(nums));
                }
            }
            boolean check = true;
            boolean reverse = false;
            for (char info : infos.toCharArray()) {
                if (info == 'R') {
                    reverse = !reverse;
                } else {
                    if (num_arr.size() == 0) {
                        check = false;
                        break;
                    }
                    if (reverse) {
                        num_arr.pollLast();
                    } else {
                        num_arr.pollFirst();
                    }
                }
            }
            if (check == true) {
                sb.append("[");
                while (!num_arr.isEmpty()) {
                    if (reverse == true) {
                        sb.append(num_arr.pollLast());
                    } else {
                        sb.append(num_arr.pollFirst());
                    }
                    if (num_arr.size() != 0) {
                        sb.append(",");
                    }
                }
                sb.append("]\n");
            } else {
                sb.append("error\n");
            }
        }
        System.out.println(sb);
    }
}

0개의 댓글