인프런 커뮤니티 질문&답변

devel님의 프로필 이미지
devel

작성한 질문수

Do it! 알고리즘 코딩테스트 with JAVA

세그먼트 트리 (인덱스 트리)

[P11726 2*N 타일채우기] top down 방식을 사용하니 런타임 에러가 발생합니다.

작성

·

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 방식으로 해결할 수 있지만, 최소한의 경계 조건 처리가 필요합니다. 주어진 코드에서 런타임 에러를 방지하기 위해 아래와 같이 변경해보세요:

  1. D 배열 초기화를 할 때 n이 0 또는 1일 경우를 처리해 줍니다.
  2. 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

devel님의 프로필 이미지
devel

작성한 질문수

질문하기