[11727 2xn 타일링2]
난이도: 실버3
11727번: 2×n 타일링 2
2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다.
www.acmicpc.net
문제
입력
출력
[아이디어]
지금 문제를 풀기 전에 이 문제를 풀고 오는 것이 더 이해하기 쉽다.
[백준] 11726 2xn 타일링 (Java)
[11726 2xn 타일링] 난이도: 실버3 11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지
kyeee2.tistory.com
D[i] = 2 x i 의 직사각형을 채우는 방법 이라고 정하자.
2 x 1 의 크기의 블럭을 놓은 경우 2 x (n - 1) 크기의 블럭을 채워야한다.
1 x 2 크기의 블럭은 2개를 같이 놓는 방법뿐이다. 이 때 2 x (n - 2) 크기의 블럭을 채워야한다.
2 x 2 크기의 블럭 1개를 놓으면 2 x (n - 2) 크기의 블럭을 채워야한다.
2 x (n - 2) 크기의 블럭을 채우는 방법이 두가지이므로 D[i] = D[i-1] + D[i-2] * 2 의 점화식이 나온다.
[JAVA 코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int N, mod = 10007;
static int [] D;
public static void main(String[] args) throws NumberFormatException, IOException {
N = Integer.parseInt(br.readLine());
D = new int [N + 1];
if(N == 1) {
System.out.println(1);
return;
}
D[1] = 1;
D[2] = 3; // 1*2 두개, 2*1 두개, 2x2 한개 => 총 3개
for(int i = 3; i <= N; i++) {
D[i] = (D[i - 1] + 2 * D[i - 2]) % mod;
}
System.out.println(D[N]);
}
}
'알고리즘 > BAEKJOON' 카테고리의 다른 글
[백준] 2156 포도주 시식 (Java) (0) | 2022.03.30 |
---|---|
[백준] 14500 테트로미노 (Java) (1) | 2022.03.30 |
[백준] 11726 2xn 타일링 (Java) (0) | 2022.03.25 |
[백준] 1647 도시 분할 계획 (Java) (0) | 2022.03.10 |
[백준] 1197 최소 스패닝 트리 (Java) (0) | 2022.03.10 |
댓글