DECUAL에서 RTE (nonzero return code)가 발생했습니다.

  • akcytm
    akcytm

    문제 링크 : https://algospot.com/judge/problem/read/DECUAL

    안녕하세요. DECUAL문제를 java로 풀어봤습니다.
    저는 이 문제를 아래와 같은 방법으로 풀었습니다.

    1. 입력받은 String을 char배열로 변환
    2. 변환한 char배열의 원소 하나하나를 보고, 적절한 동작을 함.
    3. String보다 StringBuilder가 효율이 더 좋다고 하여, StringBuilder 사용.

    문제에 있는, 예제 입력은 답을 잘 찾는데...
    답안 제출을 하면 RTE(nonzero return code)가 발생하네요 -_-;;
    무슨 에러가 발생했는지 확인할 방법이 없어서(에러코드를 볼 방법이 있나요?), 고생하고 있습니다.

    무엇을 실수한 걸까요?
    저는 Judgement 클래스의 execute 메서드의
    outputA.toString().equalsIgnoreCase(outputB.toString()
    이쪽 부분에서 메모리가 터진게 아닌가하고 추측하고 있습니다.

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            int numOfCase = 0;
    
            String stringA = "";
            String stringB = "";
    
            Scanner scan = new Scanner(System.in);
            stringA = scan.nextLine();
            numOfCase = Integer.parseInt(stringA);
            Judgement j = new Judgement(numOfCase);
            while(numOfCase--!=0) {
                stringA = scan.nextLine();
                stringB = scan.nextLine();      
                j.execute(stringA, stringB);
            }
            for(int i = 0; i < j.b_index; i++) {
                if(j.barr[i]) {
                    System.out.println("YES");
                }else{
                    System.out.println("NO");
                }
            }       
            scan.close();
        }   
    }
    class Judgement {   
        public boolean barr[];
        public int b_index;
        class CarrContainer {
            private char carr[];
            private int size;
            public CarrContainer() {
                carr = new char[1000];
                size = 0;
            }
            public void saveChar(char c) {
                carr[size++] = c;
            }
            public void outChar(StringBuilder string) {
                char tmp[] = new char[size];
                for(int i=0; i<size; i++) {
                    tmp[i]=this.carr[i];
                }
                string.append(tmp);
            }
            public void flush() {
                size = 0;
            }                       
        }
        public Judgement(int size) {
            barr = new boolean[size];
            b_index = 0;
        }
        void execute(String stringA, String stringB) {
            CarrContainer container = new CarrContainer();
            char arrA[] = stringA.toCharArray();
            char arrB[] = stringB.toCharArray();
            StringBuilder outputA = new StringBuilder("");
            StringBuilder outputB = new StringBuilder("");
    
            unzip(arrA, outputA, container);
            unzip(arrB, outputB, container);
            if(outputA.toString().equalsIgnoreCase(outputB.toString())) {
                barr[b_index++] = true;
            } else {
                barr[b_index++] = false;
            }
        }
        int unzip(char inpArr[], StringBuilder oupArr, CarrContainer container) {
            char narr[] = new char[11];
            for(int x=0;x<narr.length;x++) { narr[x]=0; }
            int nlength = 0;
            boolean isBracket = false;
            boolean isRepeatReady = false;
            for(int i=0;i<inpArr.length;i++) {
                if(inpArr[i]=='(') {
                    container.outChar(oupArr);
                    container.flush();
                    isBracket = true;
                    continue;
                } else if(inpArr[i]==')') {
                    isBracket = false;
                    continue;
                } else if(inpArr[i]=='^') {
                    isRepeatReady = true;
                    continue;
                }
    
                if(inpArr[i]>='0'&&inpArr[i]<='9') {
                    if(isRepeatReady) {
                        for(nlength=0;(i+nlength<inpArr.length)&&(inpArr[i+nlength]>='0'&&inpArr[i+nlength]<='9');nlength++) {
                            if(nlength==0 && inpArr[i]!='0') {
                                narr[0]=inpArr[i];
                                continue;
                            }                       
                            narr[nlength]=inpArr[i+nlength];
                        }       
                        i+=(nlength-1);                 
                    }
                    char tarr[] = new char[nlength];        
                    for(int x=0; x<nlength;x++) { tarr[x] = narr[x]; } nlength=0;       
    
                    int numOfRepeat = Integer.parseInt(new String(tarr));
                    for(int x=0;x<narr.length;x++) { narr[x]=0; }
                    for(int s=0;s<numOfRepeat;s++) {
                        container.outChar(oupArr);
                    }
                    container.flush();
                    isRepeatReady=false;
                    continue;
                }   
                if(isBracket) {
                    container.saveChar(inpArr[i]);
                    continue;
                }
                else {
                    container.saveChar(inpArr[i]);
                    container.outChar(oupArr);
                    container.flush();              
                }               
            }
            return 0;
        }
    }
    

    8년 전
2개의 댓글이 있습니다.
  • JongMan
    JongMan

    압축을 푼 문자열이 너무 길기 때문에 메모리 오류가 발생하지 않나 짐작해 봅니다. 이 문제는 직접 압축을 풀지 않고 해결해야 합니다.


    8년 전 link
  • akcytm
    akcytm

    아... 답변 감사합니다. 메모리 문제일수도 있군요. 새로운 해결방법을 생각해보겠습니다.


    8년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.