본문 바로가기

알고리즘

백준 - 5430 AC(Java)

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

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

 

구현 문제입니다.

 

문제 접근 순서는 다음과 같습니다.

  1. R이면 방향을 바꾼다.
  2. D이면 포인터를 옮겨 범위를 줄인다.
    1. 정방향일 경우 왼쪽의 포인터를 옮겨 범위를 줄인다.
    2. 역방향일 경우 오른쪽의 포인터를 옮겨 범위를 줄인다.

 

Deque를 통해 문제를 해결할 수도 있겠지만, 배열을 사용해 처리 속도를 높였습니다.

 

[구현 코드]

import java.util.*;
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 testCase = Integer.parseInt(br.readLine());

        while (testCase-- > 0) {
            char[] orders = br.readLine().toCharArray();
            int n = Integer.parseInt(br.readLine());
            String[] arr = br.readLine()
                    .replace("[", "")
                    .replace("]", "")
                    .split(",");

            boolean direction = true;
            int left = 0;
            int right = n - 1;
            boolean error = false;
            
            for (int i = 0; i < orders.length; i++) {
                char order = orders[i];

                // R이면 방향을 바꾼다.
                if (order == 'R') {
                    direction = !direction;
                } else {
                    if (left > right) {
                        error = true;
                        break;
                    }

                    if (direction) { // 정방향일 경우 왼쪽의 포인터를 옮겨 범위를 줄인다.
                        left++;
                    } else { // 역방향일 경우 오른쪽의 포인터를 옮겨 범위를 줄인다.
                        right--;
                    }
                }
            }

            StringBuilder result = new StringBuilder();
            if(error){
                result.append("error");
            }else{
                result.append("[");
                if(direction){
                    for(int i=left; i<=right; i++){
                        result.append(arr[i]).append(",");
                    }
                }else{
                    for(int i=right; i>=left; i--){
                        result.append(arr[i]).append(",");
                    }
                }

                // 결과 내부에 숫자 하나라도 있을 경우 맨 마지막에 ','가 추가되므로 ','삭제
                if(result.length() > 1) result.deleteCharAt(result.length()-1);
                result.append("]");
            }

            bw.write(result + System.lineSeparator());
        }

        bw.flush();
        bw.close();
        br.close();
    }
}