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

  • User Avatar
    danwoo21

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

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

    코드 :

    ~~~ java
    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;
    }
    

    }
    ~~~


    11년 전
1개의 댓글이 있습니다.
  • User Avatar
    danwoo21

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


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