본문 바로가기

CS/알고리즘

[BOJ] 5430번 : AC - Java

728x90

문제

백준

 

풀이

RDD 4 [1,2,3,4]

R(배열 뒤집기) 또는 D(앞쪽 숫자 제거)로 구성된 작업을 [1,2,3,4] 배열에 순차적으로 적용한 결과를 얻는 문제다.

 

중요한 부분이 2가지 있다.

  1. 입력데이터를 적절한 데이터로 변환
  2. 작업 수행을 얼마나 효율적으로 진행할 것인가?

1. 입력데이터를 적절한 데이터로 변환

R 또는 D로 구성된 작업 리스트는 toCharArray로 문자 배열로 변환했다.

[1,2,3,4] 형식을 배열로 변환해야 한다.

앞뒤 '[', ']'는 고정이므로 substring으로 앞뒤 한 칸씩 뺀 문자열을 얻고, split으로 콤마(,)를 기준으로 나눠주면 온전한 숫자 부분만 얻을 수 있다.

 

2. 작업 수행을 얼마나 효율적으로 진행할 것인가?

작업이 배열을 뒤집거나 가장 앞쪽 원소를 제거하는 것이다.

배열의 앞 또는 뒤 원소를 제거할 수 있다.

R 작업이 있을 때 배열을 실제로 뒤집지 않고, 제거할 방향을 알고 있는 변수를 이용해서 원소 제거 위치를 알 수 있게 한다.

배열 앞 또는 뒤의 원소 제거를 할 수 있어야 하기 때문에 LinkedList로 구현된 Deque를 이용한다.

deque.pollFirst() - 앞쪽에서 원소 제거

deque.pollLat() - 뒤쪽에서 원소 제거

LinkedList로 구현하였기 때문에 원소 제거에 시간이 오래 걸리지 않는다.

 

 

- 빈 배열의 경우 error와 [] 결과가 나올 수 있기 때문에 처리하기 까탈스럽다.

- 다른 사람의 코드를 보니까, deque를 이용해서 원소를 제거하지 않고 일반 array에서 좌우 인덱스 값을 계산해서 출력 인덱스 범위로 출력하는 방법도 있다.

 

소스코드

github

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

/**
 * [백준] 5430번 AC
 */
public class N5430 {

    public static final int LEFT = 0;
    public static final int RIGHT = 1;
    public static final int RESULT_ERROR = 2;

    public static void main(String args[]) throws IOException {
        // 입력 값 셋팅
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuffer sb = new StringBuffer();

        int T = Integer.parseInt(st.nextToken());
        while (T-- > 0) {
            char[] jobs = br.readLine().toCharArray();
            int N = Integer.parseInt(br.readLine());
            String x = br.readLine();
            String[] nn = x.substring(1, x.length() - 1).split("\\,");
            Deque<Integer> numbersList = new LinkedList<>();
            for (int i = 0; i < N; i++) {
                numbersList.add(Integer.parseInt(nn[i]));
            }

            int checkResult = doJobs(jobs, numbersList);
            
            if (checkResult == RESULT_ERROR) {
                sb.append("error").append("\n");
                continue;
            }

            sb.append('[');
            if(!numbersList.isEmpty()){
                if (checkResult == LEFT) {
                    sb.append(numbersList.pollFirst());
                    while (!numbersList.isEmpty()) {
                        sb.append(',').append(numbersList.pollFirst());
                    }
                } else if (checkResult == RIGHT) {
                    sb.append(numbersList.pollLast());
                    while (!numbersList.isEmpty()) {
                        sb.append(',').append(numbersList.pollLast());
                    }
                }
            }
            sb.append(']').append("\n");
        }
        System.out.print(sb.toString());
    }

    private static int doJobs(char[] jobs, Deque<Integer> numbersList) {
        int deleteDirection = LEFT;
        for (int i = 0; i < jobs.length; i++) {
            if (jobs[i] == 'R') {
                deleteDirection = (deleteDirection == LEFT) ? RIGHT : LEFT;
            } else if (jobs[i] == 'D') {
                if (numbersList.isEmpty()) {
                    return RESULT_ERROR;
                }
                if (deleteDirection == LEFT) {
                    numbersList.pollFirst();
                } else {
                    numbersList.pollLast();
                }
            }
        }
        return deleteDirection;
    }
}