강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của kjjdmstjs3189
kjjdmstjs3189

câu hỏi đã được viết

Do it! Thuật toán Kiểm tra Lập trình với JAVA

Cây phân đoạn (cây chỉ số)

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

Viết

·

104

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;
    }
}
java코딩-테스트알고리즘

Câu trả lời 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

Hình ảnh hồ sơ của kjjdmstjs3189
kjjdmstjs3189

câu hỏi đã được viết

Đặt câu hỏi