ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]5430: AC - JAVA
    문제풀이/백준 2021. 4. 18. 18:44

    [백준]5430: AC 

    www.acmicpc.net/problem/5430

     

    5430번: AC

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

    www.acmicpc.net

    풀이

    복잡한(자바에선 이정도 문자열이면 복잡한 문자열에 속한다고 생각한당.)문자열을 입력받은 후 문제의 조건에 맞게 출력하면 되는 문제이다.

     

    자바로 문자열 문제들을 풀때 입력 받을때, 출력할때, 문자열 쪼개고 예외케이스 처리할 때마다 머리가 아프다..

     

    처음에는 StringBuilder객체를 사용해서 직접 reverse()와 substring() 함수를 사용하여 문자열을 조작해 주었는데 시간초과가 났다. 

     

    그래서 start, end포인터를 만들어 실제로 뒤집거나 자르는 과정 없이 진행하였다. 아이디어는 아래와 같다.

    • R이면 start와 end를 바꿔주고 boolean타입의 reverse값을 반전시켜준다.
    • D라면 현재 reverse값에 따라 start를 ++하거나 --해준다. 

     

    이때, D연산이 이뤄지면 전체 숫자 배열의 크기가 하나 줄어듦으로 n--를해준다. n이 0보다 작아지면 error를 출력한다.

     

    출력할 때에도 마찬가지로 reverse값에 따라 start에서++하며 출력할지, start에서 --하며 출력할지 분리해서 출력해주었다.

     

    이번 문제에서 생각하지 못한 예외 케이스들이 많아서 이를 해결하는데 시간이 오래걸렸다. 해당 테스트 케이스들은 아래와 같다.

     

    test1)

    1

    RR

    2

    [30, 40]

    answer:[30,40]

    -> 이때 출력값이 이상하다면 원소값이 1자리수만 오는 것이 아니라 10의자리수 이상도 올 수 있다는 것을 다시 확인해야 한다.

     

    test2)

    1

    RRRRRRRRR

    0

    []

    answer: []

    -> 이때 answer값이 error로 나온다면 R연산을 할 때에는 error가 반환되지 않도록 변경해 주어야 한다.

     

    test3)

    1

    DDR

    2

    [1,2]

    answer:[]

    -> 이때 answer값이 error로 나온다면 D연산시 error처리 부분을 다시 체크해 보면 될 것이다.

     

    문자열 문제는 예외 케이스 처리 부분과 반례를 찾는것이 정말 어려운것 같다. 한번에 테스트 케이스를 통과하기 위해서 문제를 잘 읽고 문제에 제시된 예외 케이스를 빠짐없이 완벽하게 짜도록 하는 연습을 해야겠다.

     

    코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    import java.util.*;
     
    public class Main {
     
        static int n;
        static String p, x;
        static boolean errorCheck;
        static int start, end;
        static String arr[];
        static boolean reverse;
        
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
     
            int t = scan.nextInt();
            for(int i = 0; i < t; i++) {
                p = scan.next();
                n = scan.nextInt();
                x = scan.next();
                
                start = 0;
                end = n - 1;
                reverse = false;
                
                makeArr();
                if(!startCommand()) System.out.println("error");
                else printArr();
            }
        }
        
        public static boolean startCommand() {
            for(int i = 0; i < p.length(); i++) {
                char c = p.charAt(i);
                if(c == 'R') {
                    int temp = start;
                    start = end;
                    end = temp;
                    reverse = !reverse;
                } else {
                    n--;
                    if(reverse) start--;
                    else start++;
                    if(n < 0return false;
                }
            }    
            return true;
        }
        
        public static void printArr() {
            System.out.print("[");
            if(reverse) {
                for(int i = start; i >= end; i--) {
                    if(i == end) System.out.print(arr[i]);
                    else System.out.print(arr[i] + ",");
                }
            } else {
                for(int i = start; i <= end; i++) {
                    if(i == end) System.out.print(arr[i]);
                    else System.out.print(arr[i] + ",");
                }
            }
            System.out.println("]");
        }
        
        public static void makeArr() {
            x = x.substring(1, x.length() - 1);
            arr = x.split(",");
        }
    }
    cs

    '문제풀이 > 백준' 카테고리의 다른 글

    [백준]1339: 단어 수학 - JAVA  (0) 2021.04.24
    [백준]16929: Two Dots - JAVA  (0) 2021.04.21
    [백준]3109: 빵집 - JAVA  (0) 2021.04.17
    [백준]1747: 소수&팰린드롬 - JAVA  (0) 2021.04.15
    [백준]2665: 미로만들기 - JAVA  (0) 2021.04.11

    댓글

Designed by Tistory.