Algorithm

[백준] 5430: AC JAVA

하다보면 되겠지 2025. 5. 18. 23:03

접근

어렵진 않은데, 생각보다 푸는 데 되게 오래 걸렸던 문제다. 구현 문제는 알고리즘에 조금 소홀해지면 바로 표가 나는 것 같다. 

 

1. 우선 처음에는 'R' 명령어가 나올 때마다 배열을 reverse하는 단순한 방식으로 작성했고, 시간초과가 났다.

2. 그래서 R이 나올 때마다 flag값을 반전시켜 앞/뒤쪽 중 어디에서 아이템을 삭제할지 정하는 방식으로 수정했다. 

3. 이번엔 시간 초과는 안났는데, 틀렸다. 질문 게시판의 반례를 모두 입력해보아도 틀린 경우가 없었는데.. 

4. 이유가 다소 어이없었다ㅠ 내가 작성한 코드의 ArrayList.toString() 함수는 "[1, 2, 3]"과 같이 각 값 사이에 공백이 추가되어 나오는데, 문제의 테스트 케이스는 "[1,2,3]"과 같이 공백이 없는 값을 요구하고 있었다.. 그래서 replaceAll로 공백을 모두 없애주니 통과했다. 

 

다른 사람들의 코드와 비교해봤을 때 실행 시간이 다소 느린 것 같아서 그 이유를 고민해봤다. 로직은 동일한데, 자료구조의 문제였던 것 같다. 내가 사용한 ArrayList는, 만약 첫 번째 아이템을 remove한다면 뒤쪽의 아이템들을 모두 앞당기는 과정이 필요하다고 한다.(by gpt) 그런데 676ms가 나온 해당 코드를 보면 Deque를 사용하고 있다. 디큐도 잘 알고 있는 자료구조였지만, 알고리즘 문제를 풀며 자주 접하게 되지는 않다보니 이를 사용할 생각을 못한 것 같다. 

 

코드

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

class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        int tc = Integer.parseInt(br.readLine());
        for(int t = 0;t < tc;t++){
            // 입력값 저장
            char[] p = br.readLine().toCharArray();
            int n = Integer.parseInt(br.readLine());
            String[] numStrArr = br.readLine().split(",|\\[|\\]");  // 양 끝에는 빈 리스트가 올 것
            
            // 숫자 배열 전처리
            ArrayList<Integer> numArr = new ArrayList();

            for(int i = 0;i < n;i++)
                numArr.add(Integer.parseInt(numStrArr[i+1]));

            String res = solve(p, numArr);
            sb.append(res).append("\n");
        }
        
        System.out.println(sb.toString());
    }

    public static String solve(char[] commandArr, ArrayList<Integer> numArr){
        // 첫 번째 코드(시간 초과)
        /**
        int commandCnt = commandArr.length;
        for(int i = 0;i < commandCnt;i++){
            char c = commandArr[i];
            if(c == 'R'){
                Collections.reverse(numArr);
            }
            else {  // c == 'D'
                if(numArr.size() == 0)
                    return "error";
                else
                    numArr.remove(0);
            }
        }

        return numArr.toString();
        **/

        int commandCnt = commandArr.length;
        boolean reverseFlag = false;
        
        for(int i = 0;i < commandCnt;i++){
            char c = commandArr[i];
            if(c == 'R'){
                reverseFlag = !reverseFlag;
            }
            else {  // c == 'D'
                if(numArr.size() == 0)
                    return "error";
                else{
                    if(reverseFlag)
                        numArr.remove(numArr.size()-1);
                    else
                        numArr.remove(0);
                }
            }
        }

        if(reverseFlag)
            Collections.reverse(numArr);

        return numArr.toString().replaceAll(" ", "");
    }
}