[백준](Java) 5430 - AC

민지킴·2021년 8월 16일
0

백준

목록 보기
45/48
post-thumbnail

문제링크

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

문제 풀이

너무 오랜만에 풀어보는 문제였다. 푸는데 시간이 꽤 걸렸다.

String을 쓰게되면 문자열이 새로 추가될때마다 새로운 String을 만드는 작업을 하게 되므로 시간과 자원을 많이 잡아먹는다. 그래서 StringBuilder를 사용했다.

num이 0이고 첫번째 연산이 D인 경우에는 무조건 error가 발생 하는 특이 케이스가 있으므로 이를 따로 처리했다.

        if(num==0 && "D".equals(commandLine[0])){
            sb.append("error\n");
            return;
        }

R이 나온경우에는 idx를 부호를 반대로 하게 되는데
idx가 양수인경우에는 0 -> n 번째로, 음수인 경우에는 0 <- n으로 방향을 이동할수있도록 했다. 이를 나타내기 위해 최소값을 min, 최댓값을 max로 하여
D가 나왔을 경우 현재의 idx 방향이 양수일 경우 min++, max++를 해주어 범위를 좁혀 나간다.

하지만 배열안에 원소가 없는 경우 D가 나왔을때는 error 처리 시킨다.

이상없이 for문이 끝났다면 결과값을 만든다
시작과 끝에 대괄호를 append 해주고 idx가 양수이면 앞에서부터, idx가 음수이면 뒤에서부터 sb에 값을 더해준다.

코드

import java.util.*;

public class Main {

    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            operateAC(sc.next(), sc.nextInt(), sc.next());
        }
        System.out.println(sb);
    }

    public static void operateAC(String command, int num, String array) {

        String[] data = array.replace("[", "").replace("]", "").split(",");
        String[] commandLine = command.split("");
        int idx = 1;
        int min = 0;
        int max = data.length;
        if(num==0 && "D".equals(commandLine[0])){
            sb.append("error\n");
            return;
        }
        for (int i = 0; i < commandLine.length; i++) {
            if ("R".equals(commandLine[i])) {
                idx *=-1;
            } else {
                if (min<max) {
                   if(idx>0){
                       min++;
                   }else{
                       max--;
                   }
                } else {
                    sb.append("error\n");
                    return;
                }
            }
        }

        sb.append("[");
        if (idx > 0) {
            for (int i = min; i <max; i++) {
                if(i!=max-1){
                    sb.append(data[i] + ",");
                }else{
                    sb.append(data[i]);
                }

            }
        } else {
            for (int i = max-1; i >= min; i--) {
                if(i !=min){
                    sb.append(data[i] + ",");
                }else{
                    sb.append(data[i]);
                }
            }
        }
        sb.append("]\n");
        return;
    }
}

profile
하루하루는 성실하게 인생 전체는 되는대로

0개의 댓글