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 |