QUADTREE 문제, RTE (nonzero return code) 발생 원인을 모르겠습니다.

  • shucream
    shucream

    안녕하세요?
    QUADTREE 문제에서 런타입오류 RTE (nonzero return code) 가 나는데,
    원인이 무엇인지 정말 모르겠습니다.

    제 로직은 이렇습니다.

    주어진 quadtree 압축문자열을 읽어나가면서 4분면에 대한 HashMap 형태로 저장하고 해당 4분면을 반전시킨 결과를 별개의 답안용 HashMap에 저장

    1. x가 등장할 경우 해당 x의 위치, 즉 부모x의 key에 자신의 index를 덧붙인 string을 새로운 key로 하고, 해당 x를 구성하는 4분면의 정보(char[4])를 value 값에 저장해나가면서, 4분면정보가 다 채워지면 HashMap 에 put을 함
    2. 위 2번 후, 즉시 해당 x가 상하반전되었을 때의 결과물로서 key값이 반전된 새로운 key와, 4분면 정보인 char[4]가 반전된 새로운 4분면 결과(char[4])를, 반전quadtree 정로를 저장하는 결과HashMap에 put을 함.

    (예)

    • xbwwb -> x(bwwb) --> {("0","bwwb")}
    • xbwxwbbwb -> x(bwx(wbbw)b) --> {("0","bwxw"), ("03","wbbw")}
    • xxwwwbxwxwbbbwwxxxwwbbbwwwwbb -> x(x(wwwb)x(wx(wbbb)ww)x(x(x(wwbb)bww)wwb)b) --> {("0","xxxb"), ("00","wwwb"), ("01","wxww"),("011","wbbb"),("03","xwwb"),("030","xbww"),("0300","wwbb")}

    로직을 말로 적으려니 쉬운게 아니네요ㅠ_ㅠ
    혜안을 가지신 분, 일침을 가해주실 분들이 계실 거라 믿고 이렇게 도움을 요청드립니다.
    아래는 소스입니다.

    import java.util.HashMap;
    import java.util.Scanner;
    
    public class Main {
    
        static int T;
    
        public static void main(String[] args) throws Exception {
    
            Scanner sc = new Scanner(System.in);
    
            T = Integer.parseInt(sc.nextLine());
    
            for(int testCase = 1; testCase <= T; testCase++) {
    
                String read = sc.nextLine();
    
                char myChar;            
                int ixMain = 0, ixSub = 0;
                String ixKey = "";
                // riginal quadtree의 x에 대한 정보를 가진 map  
                HashMap<String, char[]> map = new HashMap<String, char[]>();    
                // original quadtree의 상하반전 결과 map
                HashMap<String, char[]> nMap = new HashMap<String, char[]>();   
    
                if(read.length() == 1) {    // 1자리는 그냥 출력
                    // Answer
                    System.out.println(read);
                }
                else {
                    do {
                        myChar = read.charAt(ixMain);
                        if( myChar == 'x' ) {   // x이면
                            if( ixKey.length() > 0 ) {
                                char arr[] = map.get(ixKey);
                                arr[ixSub] = myChar;
                            }
                            ixKey += ixSub;
                            map.put(ixKey, new char[4]);
                            ixSub = 0;
                            continue;
                        } 
                        else {
                            char arr[] = map.get(ixKey);
                            arr[ixSub++] = myChar;
    
                            if( ixSub == 4 ) {
                                // arr
                                char nArr[] = new char[arr.length];
                                for(int i = 0; i < arr.length; i++) {
                                    nArr[reflect(i)] = arr[i];
                                }
                                // key
                                char nKey[] = ixKey.toCharArray();
                                for(int i = 1; i < nKey.length; i++) {
                                    nKey[i] = Character.forDigit(reflect(Character.getNumericValue(nKey[i])), 10);
                                }
                                // nMap 에 적재
                                nMap.put(String.valueOf(nKey), nArr);
                                ixSub = Integer.parseInt(ixKey.substring(ixKey.length()-1)) + 1;
                                ixKey = ixKey.substring(0, ixKey.length()-1);
                            }
                        }
    
                    } while ( ++ixMain < read.length() );
    
                    // 답안작성
                    int index = 0;
                    ixKey = String.valueOf(index);
                    StringBuffer buff = new StringBuffer("x");
                    do {
                        char arr[] = nMap.get(ixKey);
                        buff.append(arr[index]);
                        if( 'x' == arr[index] ) {
                            ixKey += index;
                            index = 0;
                        }
                        else {
                            if(++index == 4) {
                                if(ixKey.length() > 1) {
                                    index = Integer.parseInt(ixKey.substring(ixKey.length()-1)) + 1;
                                    ixKey = index == 4? "END" : ixKey.substring(0, ixKey.length()-1);
                                }
                                else {
                                    ixKey = "END";
                                }
                            }
                        }
                    } while( ixKey != "END" );
                    // Answer
                    System.out.println(buff.toString());
                }
            }
            sc.close();
        }
    
        /* 상하반전을 위한 변경
         * 0,1,2,3 분면 -(반전)-> 2,3,0,1
         */
        private static int reflect(int val) {
            int result = 0;
            switch(val) {
            case 0: 
                result = 2;
                break;
            case 1: 
                result = 3;
                break;
            case 2: 
                result = 0;
                break;
            case 3: 
                result = 1;
                break;
            }
            return result;
        }
    }
    

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