1 분 소요



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



📌 문제

문제 유형

  • 구현
  • 자료구조
  • 문자열
  • 파싱


문제 설명


입력

4
RDD
4
[1,2,3,4]
DD
1
[42]
RRD
6
[1,1,2,3,5,8]
D
0
[]

출력

[2,1]
error
[1,2,3,5,8]
error



🔍 문제 풀이

로직 순서

  1. 입력 배열 문자열에서 숫자만 파싱하여 Deque에 저장
  2. 명령어 문자열 순회
    • R: 뒤집기 → isReversed 토글
    • D: 삭제
      • 비어있으면 error 출력하고 종료
      • isReversed 여부에 따라 앞/뒤 삭제
  3. 최종 출력 시 isReversed 방향에 따라 pollFirst 또는 pollLast


문자열 파싱

다양한 방법이 있지만, 가장 간편해 보이는 StringTokenizer을 사용하여 문자열을 파싱하였다.

입력 배열은 문자열로 주어지므로 StringTokenizer를 사용하여 숫자만 추출한다.

StringTokenizer st = new StringTokenizer(input, "[],");
while (st.hasMoreTokens()) {
    dq.offer(Integer.parseInt(st.nextToken()));
}
  • 구분자 "[],"를 기준으로 나누면 숫자만 남게 된다.
  • int 배열 [1,2,3,4] -> 1,2,3,4로 분해됨



📌 놓친 점

  1. isReversed = true가 아니라, isReversed = !isReversed로 상태를 관리해야 한다.
    • R이 여러번 나올 수 있기 때문
  2. D일 때만 dq.isEmpty() 체크 필요
    • R은 단순 방향 변경이므로 비어 있어도 문제 없기 때문
  3. error 발생 시 바로 continue 또는 break로 이후 출력을 건너뛰어야 한다.
    • 이후 출력 로직이 실행되면 불필요한 출력이 발생
  4. isReversed= true일 땐 앞이 아니라 뒤에서 삭제해야 하므로 pollLast() 써야한다.
  5. 뒤집기(R)는 실제 데이터를 뒤집는 게 아니라, 출력 방향만 토글하여 처리한다.



💻 전체 코드

import java.io.*;
import java.util.*;

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

        while(t-->0) {
            // 기본 입력
            String p = br.readLine(); // 수행할 함수
            int n = Integer.parseInt(br.readLine()); // 배열에 들어있는 수의 개수
            String input = br.readLine(); // 배열에 들어있는 정수


            // 문자열 파싱 후 Deque에 넣기
            Deque<Integer> dq = new ArrayDeque<>();

            StringTokenizer st = new StringTokenizer(input, "[],");
            while (st.hasMoreTokens()) {
                dq.offer(Integer.parseInt(st.nextToken()));
            }


            // 명령 실행 (R:뒤집기, D:삭제)
            boolean isReversed = false;
            boolean isError = false;

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

                if(c=='R'){
                    isReversed = !isReversed; // 주의
                }

                else if(c=='D'){
                    if(dq.isEmpty()){
                        System.out.println("error");
                        isError = true;
                        break;
                    }

                    if(isReversed) dq.pollLast(); // 주의
                    else dq.pollFirst();
                }
            }


            // 출력
            if (!isError) {
                StringBuilder sb = new StringBuilder();
                sb.append("[");
                while (!dq.isEmpty()) {
                    sb.append(isReversed ? dq.pollLast() : dq.pollFirst()); // 주의
                    if (!dq.isEmpty()) sb.append(",");
                }
                sb.append("]");
                System.out.println(sb);
            }
        }
    }
}


카테고리:

업데이트:

댓글남기기