[P11726 2*N 타일채우기] top down 방식을 사용하니 런타임 에러가 발생합니다.
105
5 asked
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;
}
}
Answer 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
백준 1940 주몽의 명령 시간복잡도
0
59
0
다음영상이 문제 풀이 영상이라고 하셨는데 문제풀이 영상이 누락되어있는 것 같습니다
0
127
1
코딩테스트 디버깅
0
347
1
탐색 순서 질문
0
148
1
2018 연속된 자연수의 합 구하기 백준 사이트에서 메모리 초과 오류가 발생합니다.
0
201
1
1강 시간복잡도 중간에 중첩for문 직전에 상수는 상관없어요 하신 부분이 이해가 안됩니다
0
159
1
왜 int, long은 안되는지 궁금합니다.
0
224
1
DNA 비밀번호 (백준 12891) 통과가 안됩니다.
0
525
2
LCA 빠르게 구하기 Java 코드 시간초과
0
244
1
스택문제 백준 1874
1
459
1
백준11659 구간합 런타임 에러
0
306
1
백준 2178 미로탐색 질문 입니다.
0
448
1
구간합구하기1 (백준11659)
0
422
1
혹시 다른 ide에서 잘 돌아가는 프로그램이
0
349
1
내림차순으로 정렬하기 강의에서..
0
267
1
백준 11720 숫자의 합 질문 있습니다
0
433
1
(숫자의 합)1<=N <=100 사이의 값
0
383
1
소수구하기-백준 1929 질문
0
350
1
12891_DNA비밀번호
0
633
3
숫자의 합 구하기
0
391
1
안녕하세요 질문있습니다.
0
336
0
union 코드에 질문 있습니다.
0
401
2
[그리디 실전 문제] 최솟값을 만드는 괄호 배치 찾기 (백준 1541) - 반례를 못찾겠습니다 ㅠㅠ
1
309
1
[이진 탐색 실전 문제] 원하는 정수 찾기 편 질문
0
505
1

