본문 바로가기

알고리즘

11727 2xn 타일링 2

2×n 타일링 2

문제

2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.

아래 그림은 2×17 직사각형을 채운 한가지 예이다.

입력

첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)

출력

첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.

풀이

타일링 채우는 것을 n이 1일때부터 차례대로 그려보면 쉽게 규칙을 찾을 수 있다.
1개를 그리는 방법 : ㅣ
2개를 그리는 방법 : ㅣㅣ, = ,ㅁ
3개를 그리는 방법 : ㅣ=, ㅣㅁ, ㅣㅣㅣ, =ㅣ, ㅁㅣ
3개부터 규칙을 찾아보면
1개에서 가로 작대기 두개로 3을 채우는 것과, 네모(2x2)로 채우는 두가지 방법
+
2개에서 세로 작대기 한개를 추가하여 3을 채우는 방법인 것을 확인할 수 있다.

즉 n번째 그리를 수 있는 경우는 ((n-2) * 2) + n-1 이다.
dp[n] = (dp[n-2] * 2 + dp[n-1])

코드

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        int[] dp = new int[n + 1];

        if (n == 1) {
            System.out.println(1);
        }else {
            dp[1] = 1;
            dp[2] = 3;
            for (int i = 3; i <= n; i++) {
                dp[i] = (dp[i - 2] * 2) + dp[i - 1];
                dp[i] %= 10007;
            }

            System.out.println(dp[n]);
        }
    }
}

'알고리즘' 카테고리의 다른 글

14503 로봇 청소기 (Java)  (0) 2022.05.04
17140 이차원 배열과 연산 (Java)  (0) 2022.05.02
23290 마법사 상어와 복제(Java)  (0) 2022.04.30
3671 산업 스파이의 편지 (Java)  (0) 2022.04.28
1174 줄어드는 수 (Java)  (0) 2022.04.25