알고리즘 (with JAVA)/동적 계획법
타일링 방법의 수 세기 (난이도: 하)
백_곰
2022. 10. 3. 22:24
1. 문제 설명
(1) 2xN 크기의 사각형을 2x1 크기의 타일로 채우는 방법의 수를 계산하는 문제가 있다고 하자.
(2) 타일들은 서로 겹쳐서는 안 되고 90도로 회전해서 쓸 수 있다.
(3) 예를 들어, N=5라고 하면, 아래의 그림과 같이 여덟 가지의 방법이 있다.
(4) 이때 N의 최댓 값이 100이라고 할 때 타일을 채우는 방법의 수를 찾는 프로그램을 작성하시오.
2. 입출력 조건 및 예제
입력 조건
(1) 입력의 첫 줄에는 테스트 케이스의 수 C가 주어진다.
(2) 그 후 각 줄에 사각형의 너비(1<=N<=100)이 주어진다.
출력 조건
X
입력 예제
2
5
50
출력 예제
8
365010934
3. 제약 조건
X
4. 가정법
X
5. 기저 사례
(1) 더 이상 사각형을 쪼갤 수 없는 경우
6. 코드
public class TILING2 {
private static BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
private static StringBuilder sb = new StringBuilder();
private static int MOD=1000000007;
private static int[] cache;
public static void main(String[] args) throws IOException {
StringTokenizer st;
int C = Integer.parseInt(sc.readLine());
for(int i=0; i<C; i++) {
cache = new int[101];
sb.append(solve(Integer.parseInt(sc.readLine()))+"\n");
}
System.out.println(sb);
}
private static int solve(int width) {
// 기저 사례(1): 더 이상 사각형을 쪼갤 수 없는 경우
if(width<=1) return 1;
if(cache[width]!=0) return cache[width];
// 가로 두 칸을 없앨 경우: solve(width-2)
// 세로 두 칸을 없앨 경우: solve(width-1)
return cache[width] = (solve(width-1) + solve(width-2)) % MOD;
}
}