codingtest

5430번 - AC

2026-04-02
2분 분량
JAVA백준

문제 링크

문제 풀이 시간 : 25분

문제 요약

  • 함수 R은 배열을 뒤집는 연산
  • 함수 D는 첫 번째 원소를 버리는 연산
  • 단, 배열이 비어 있을 때 D를 수행하면 error
  • 주어진 함수 문자열을 순서대로 수행한 뒤 최종 배열을 출력하는 문제

문제 풀이

처음에는 문제 설명 그대로 R이 나올 때마다 배열을 실제로 뒤집고, D가 나오면 맨 앞 원소를 제거하면 되겠다고 생각했다.

하지만 이 방식은 비효율적이다.

R이 여러 번 등장할 수 있는데 그때마다 배열 전체를 뒤집으면 시간 복잡도가 너무 커진다.

이 문제의 핵심은 실제로 뒤집을 필요가 없다는 점이다.

배열이 뒤집힌 상태인지 아닌지만 boolean 값으로 관리하면 된다.

  • 정방향이면 앞에서 제거
  • 역방향이면 뒤에서 제거

즉, R이 나올 때마다 head 값을 뒤집고 D가 나오면 현재 방향에 따라 앞이나 뒤에서 하나 꺼내면 된다.

이 방식이면 배열을 매번 뒤집지 않아도 되고 모든 연산을 Deque로 효율적으로 처리할 수 있다.

입력 배열도 Deque에 넣어두고 모든 연산을 처리한 뒤 현재 방향에 맞게 앞에서부터 또는 뒤에서부터 꺼내며 출력하면 된다.

최종 코드

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

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int T = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();

        for (int t = 0; t < T; t++) {
            String p = br.readLine();
            int n = Integer.parseInt(br.readLine());

            String input = br.readLine();
            input = input.substring(1, input.length() - 1);

            Deque<Integer> array = new ArrayDeque<>();
            StringTokenizer st = new StringTokenizer(input, ",");

            // 입력 배열을 덱에 저장
            while (st.hasMoreTokens()) {
                array.addLast(Integer.parseInt(st.nextToken()));
            }

            boolean head = true;   // true면 정방향, false면 역방향
            boolean error = false;

            for (int i = 0; i < p.length(); i++) {
                char op = p.charAt(i);

                // 뒤집기 연산은 실제로 뒤집지 않고 방향만 반전
                if (op == 'R') {
                    head = !head;
                    continue;
                }

                // 버릴 원소가 없으면 에러
                if (array.isEmpty()) {
                    error = true;
                    break;
                }

                // 현재 방향에 따라 앞 또는 뒤에서 제거
                if (head) array.pollFirst();
                else array.pollLast();
            }

            if (error) {
                sb.append("error").append("\n");
            } else {
                sb.append("[");

                // 현재 방향에 맞게 결과 출력
                while (!array.isEmpty()) {
                    if (head) sb.append(array.pollFirst());
                    else sb.append(array.pollLast());

                    if (!array.isEmpty()) {
                        sb.append(",");
                    }
                }

                sb.append("]").append("\n");
            }
        }

        System.out.print(sb);
    }
}

함께 읽으면 좋은 글

코딩 테스트2026-04-02

1966번 - 프린터 큐

여러 문서가 큐에 들어 있고, 각 문서마다 중요도가 있음 맨 앞 문서를 확인했을 때, 더 높은 중요도의 문서가 뒤에 하나라도 있으면 맨 뒤로 보냄 그렇지 않으면 바로 인쇄 특정 위치의 문서가 몇 번째로 인쇄되는지 구하는 문제 이 문제는 프린터의 동작을 그대로 구현하면 되는…

코딩 테스트2026-03-29

1158 - 요세푸스 문제

1번부터 N번까지 사람이 원형으로 앉아 있음 순서대로 K번째 사람을 제거 모든 사람이 제거될 때까지 반복 제거되는 순서를 출력하는 문제 이 문제는 원형으로 순회하면서 K번째를 제거하는 과정을 그대로 구현하면 된다.

코딩 테스트2026-03-29

2164번 - 카드2

1부터 N까지 카드가 순서대로 쌓여 있음 맨 위 카드를 버리고, 그다음 맨 위 카드를 맨 아래로 옮기는 과정을 반복 마지막에 남는 카드 번호를 구하는 문제 이 문제는 규칙을 찾기보다, 문제에서 하라는 과정을 그대로 구현하면 된다. 카드 더미에서 반복되는 동작은 두 가지다.

코딩 테스트2026-02-13

17070번 - 파이프 옮기기 1

크기 N × N 격자에서 파이프를 이동시키는 경우의 수를 구하는 문제 파이프는 항상 2칸을 차지하며, 방향은 총 3가지 시작 상태는 (1,1) ~ (1,2) 가로 방향 파이프의 한쪽 끝이 (N, N) 에 도달하는 모든 경우의 수를 계산 처음 문제를 읽었을 때는 👉 그래프…