Java코드를 제출하니까 RTE (nonzero return code) 오류가 납니다.

  • jaeha1223
    jaeha1223

    RTE (nonzero return code) 오류

    문제 : COINS

    이클립스로 실행시엔 에러는 나오지 않습니다.
    문제의 1번째와 3번째 테스트 케이스인

    2
    110 4
    10 50 100 500
    3600 5
    100 300 500 900 2000

    에서는 정상적으로 답이 잘 나옵니다.
    다른 테스트 케이스의 경우엔 아예 답을 못구하지만 스택오버플로 등의 에러도 발생하지도 않습니다.
    그런데 제출할때는 계속 런타임오류가 뜨더라구요.
    관련 문제를 알고스팟에서 열심히 찾아봤지만 못찾겠어서 질문드려요.

    스택오버플로우나도 RTE (nonzero return code) 에러가 발생하는건가요?
    아래 코드에서 어떤 부분이 에러를 발생시키는지를 계속 봐도 모르겠습니다.

    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Scanner;
    
    public class Main {
    
        static int[] coinArray;
        static int targetMoney;
        static int cnt;
        static HashMap<String, Integer> map = new HashMap<String, Integer>();
        static HashMap<String, Integer> cntmap = new HashMap<String, Integer>();    //for debug 원래는 cnt를 쓰면 된다
    
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            Scanner sc = new Scanner(System.in);
            int cases = sc.nextInt();
            while (cases-- > 0) {
                map.clear();
                cntmap.clear();
                cnt = 0;
    
                targetMoney = sc.nextInt();
                int moneyCases = sc.nextInt();
    
                coinArray = new int[moneyCases];
                int[] array = new int[moneyCases];
                map.put(Arrays.toString(array)
                        , 0);
                for (int i = 0; i < moneyCases; i++) {
                    coinArray[i] = sc.nextInt();
                }
    
                recursiveEachCase(array.clone());
                if (cntmap.size() > 1000000007) {
                    System.out.println(cntmap.size() % 1000000007);
                } else
                    System.out.println(cntmap.size());
            }
        }
    
        private static int recursiveEachCase(int[] array) {
            for (int i = 0; i < coinArray.length; i++) {
                // 현재 메소드에서 사용할 동전 개수 증가
                array[i]++;
    
                Integer nextSum = map.get(Arrays.toString(array));
                if( nextSum == null )
                {
                    int [] prearray = array.clone();
                    prearray[i]--;
                    nextSum = coinArray[i] + map.get(Arrays.toString(prearray));
                    map.put(Arrays.toString(array), nextSum);
                }
    
                if (nextSum > targetMoney) {
                    return -1;
                }
                if (nextSum == targetMoney) {
                    cntmap.put(Arrays.toString(array), nextSum);
                    return -1;
                }
                recursiveEachCase(array.clone());
                array[i]--;
            }
    
            return -1;
        }
    
    }
    

    10년 전
2개의 댓글이 있습니다.
  • hyunhwan
    hyunhwan
    1. stack overflow가 날 경우, 프로그램이 비정상적으로 종료된 것으로 간주 되기 때문에 RTE가 발생합니다.
    2. 자세히 코드를 본 것은 아닙니다만, cntmap의 size가 10^9가 될 가능성을 염두해 두고 코드를 작성하신 것 같은데, 10^8정도만 되더라도 최대 할당할 수 있는 메모리 범위를 넘어가기 때문에 오류가 발생할 것으로 보입니다.

    10년 전 link
  • Being
    Being

    네, LIBe님께서 말씀해주신 대로 OutOfMemoryError가 발생할 것 같네요.


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