코딩 테스트

(Java) 백준 11726 - 2xn 타일링

로승리 2022. 5. 27. 04:26

문제를 보고 전형적인 DP 문제라고 생각했다.

점화식은 DP[n] = DP[n-1] + DP[n-2]로 조금만 생각해보면

금방 나오는 간단한 문제다.

이 문제를 풀면서 느꼈던것은 입력값이 최소인 1인 경우

평소 하던것처럼 배열을 n+1만 생성하면 dp[2]가 들어갈 공간이 없어서

ArrayIndexOutOfBounds가 난다는것과

메서드를 리턴 받고 나중에 10007로 나눈다면 입력값이 1000일 때

바로 오버플로우 문제가 일어나기 때문에 dp배열에 값을 저장할 때마다

10007로 나눠서 저장해야 한다는 점이다.

두 가지를 생각하지 못해 제출을 8번이나 했다.

 


최종 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        System.out.println(bottomUp(n));
    }
    public static int bottomUp(int num) {
        // 입력값이 1일 경우를 대비해서 배열 생성
        int[] dp = new int[num + 2];
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i < num + 1; i++) {
            // 오버플로우 방지를 위해
            dp[i] = (dp[i-1] + dp[i-2]) % 10007;
        }
        return dp[num];
    }
}