원주율 외우기 문제 RTE오류 질문드려요

  • danwoo21
    danwoo21

    문제 : PI
    제출결과 :
    RTE (SIGKILL: program was forcefully killed, probably memory limit exceeded)

    질문 :
    남은 자릿수에 따라 계산된 최소 난이도를 저장하는 방식으로 메모이제이션 적용했습니다. 따라서 메모를 위한 배열의 크기는 최대 10001 * 4 byte 까지 가능합니다. 메모리 제한이 65536kb 인데 왜 memory limit exceeded 에러가 뜨는지 모르겠어요.. 자릿수 1만으로 해서 테스트 해봤는데 제 pc에서는 메모리 제한이 따로 없어서 그런지 잘됩니다..

    코드 :

    import java.util.Scanner;
    
    public class Main {
        private static String pi; //8자리 이상 10000자리 이하의 수(0으로 시작 가능)
        private static int[] memo;
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int c = in.nextInt();
            in.nextLine(); //clear buffer
            for (int i = 0; i < c; i++) {
                pi = in.nextLine();
                memo = new int[pi.length()+1];
                cost(pi);
                System.out.println(memo[pi.length()]);
            }
            in.close();
        }
        //3, 4, 5 자리씩 끊어보면서 재귀호출로 구해진 난이도의 최솟값을 memo[sub.length()] 에 저장하는 함수 
        public static int cost(String sub) {
            int min = Integer.MAX_VALUE;
            int cost, tmp;
            if (sub.length() == 0)
                return 0;
            if (sub.length() < 3)
                return 11;
    
            if (memo[sub.length()] != 0) {
                return memo[sub.length()];
            }
            for (int i = 3; i <= 5; i++) {
                if (i > sub.length())
                    return min;
                cost = check(sub.substring(0, i));
                tmp = cost(sub.substring(i, sub.length()));
                if (cost + tmp < min) {
                    min = cost + tmp;
                }
            }
            return memo[sub.length()] = min;
        }
        //주어진 sub의 난이도를 계산하는 함수
        public static int check(String sub) {
            int[] d = new int[sub.length()-1];
            boolean hard = false;
            for (int i = 0; i < sub.length() - 1; i++) {
                d[i] = sub.charAt(i+1) - sub.charAt(i);
            }
            int prev = d[0];
            for (int i = 1; i < d.length; i++) {
                if (prev != d[i] && prev != -d[i]) {
                    hard = true;
                    break;
                }
                prev = d[i];
            }
            if (!hard) {
                if (d[0] == 0)
                    return 1;
                else if (d[0] == -d[1])
                    return 4;
                else if (prev == 1 || prev == -1)
                    return 2;
                else 
                    return 5;
            }
            else
                return 10;
        }
    }
    


    9년 전
1개의 댓글이 있습니다.
  • danwoo21
    danwoo21

    해결했습니다. substring을 안쓰고 charAt 메소드로 직접 인덱스에 접근하는 방식으로 코드를 수정하니 에러가 안나네요. 속도에도 많은 차이가 있으니 되도록이면 substring을 지양해야 겠습니다..


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