문제 : [[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;
}
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;
}
~~~
11년 전