작성
·
14
0
top down 방식을 사용하니 런타임 에러가 발생합니다. 이 문제는 bottom up으로만 풀어야하나요? 런타임 에러가 난 이유는 무엇일까요?
import java.util.Scanner;
public class Main {
static long[] D;
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
D = new long[n+1];
for(int i = 0 ; i < n+1 ; i++){
D[i] =-1;
}
D[1] =1;
D[2] =2;
long result = DP(n);
System.out.println(result);
}
public static long DP(int n){
if(D[n] != -1){
return D[n];
}
return D[n] = (DP(n-1) + DP(n-2)) % 10007;
}
}
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
devel님, [P11726 2*N 타일채우기] 문제에서 런타임 에러가 발생하는 이유는 n
값이 1 또는 2일 때 D
배열을 미리 초기화하고 사용하지 않아, 인덱스 범위 초과가 일어날 가능성이 있기 때문입니다. 이 문제는 top-down 방식으로 해결할 수 있지만, 최소한의 경계 조건 처리가 필요합니다. 주어진 코드에서 런타임 에러를 방지하기 위해 아래와 같이 변경해보세요:
D
배열 초기화를 할 때 n
이 0 또는 1일 경우를 처리해 줍니다.D
배열에 초기 값 0과 1에 대한 값을 미리 할당해 줍니다.D[0] = 0; // 추가
D[1] = 1;
if (n >= 2) { // 추가 조건
D[2] = 2;
}
또한, 재귀 호출이 너무 깊어질 경우 런타임 에러가 발생할 가능성이 있으므로, n
의 값이 크게 느껴질 때는 bottom-up 방식이 더 안정적일 수 있습니다. bottom-up 방식은 작은 문제를 쌓아가면서 큰 문제를 해결하므로, 스택 오버플로우 등의 위험이 줄어듭니다.
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html