baekjoon/String

백준 5430번 : AC 자바

Meluu_ 2024. 8. 21. 11:39

🧫 문제 분석

✔️ 출처

AC 골드 5

 

📖 문제

 

문자열, 구조 문제이다.

덱이 생각이 안나서 그냥 투 포인터로 풀었다..ㅎㅎㅎㅎ

 

문제에서 핵심은 

문자열 파싱 : [1,2,3,4] 이런 식으로 입력이 주어지기에 이를 적절하게 파싱한다.

R : 배열 순서 뒤집기

D : 첫번째 요소 삭제

빈 배열에 D를 사용할 경우 에러 발생

 

[1,2] 에서 DD 를 하면 [] 을 출력한다. error가 아니다. 

 

 

문자열 파싱은 subString으로 앞 뒤의  ' [ ' , ' ] ' 를 짤라내고

split으로 정규표현식을 사용하여 [^0-9]로 숫자가 아닌 모든 것을 기준으로 짤라 문자열 배열을 만들었고

이를 int 배열에 파싱하여 저장하였다. 

 

두 개의 포인터를 사용하여 풀었다. 

자세한건 코드를 참고해주면 좋을 것 같다. 

 


🔅 문제 풀이

import java.io.*;

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

        for (int i = 0; i < T; i++) {
            String func = br.readLine(); // R,D 등 함수 
            int size = Integer.parseInt(br.readLine()); // 요소 개수
            StringBuilder sb = new StringBuilder();
            int[] arr = new int[size];

            // 배열 입력 처리
            String element = br.readLine();
            String str = element.substring(1, element.length() - 1);
            String[] split = str.split(",");

            for (int j = 0; j < size; j++) {
                arr[j] = Integer.parseInt(split[j]);
            }
            
            int pointer = 0, prePointer = arr.length - 1;
            boolean flag = false; // false = 오름차, true 내림차

            for (int j = 0; j < func.length(); j++) {
                // R (뒤집기) 일 경우 두 포인터를 스왑
                if (func.charAt(j) == 'R') {
                    int tmp = pointer;
                    pointer = prePointer;
                    prePointer = tmp;
                    flag = !flag; // 뒤집기
                    
                } else {
                    if (flag) pointer--;
                    else pointer++;
                }
            }

            // 배열의 범위를 벗어날 경우 에러
            if (pointer < -1 || pointer > size 
                    || prePointer < -1 || prePointer > size) {
                bw.write("error\n");
                continue;
            }

            sb.append("[");
            
            if (flag) {
                for (int j = pointer; j >= prePointer; j--) {
                    sb.append(arr[j]).append(",");
                }

            } else {
                for (int j = pointer; j <= prePointer; j++) {
                    sb.append(arr[j]).append(",");
                }
            }

            // 빈 배열이 아닐 경우 ',' 제거
            if(sb.length() > 1) {
                sb.deleteCharAt(sb.length() - 1);
            }
            sb.append("]\n");
            
            bw.write(sb.toString());
        }
        bw.flush();
        bw.close();
    }
}

 

 

 

❗ 오답노트 / 필요한 지식

  1.  swap 안쓴지 정말 오래되서 이상하게 swap해버려 초반에 틀렸다. 이번 기회에 다시 복습하게 되어 다행이다.