문제
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
# 입력
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
# 출력
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
이 문제는 "다이나믹 프로그래밍" 기법을 사용하여 해결할 수 있다.
다이나믹 프로그래밍이란,
큰 문제를 작은 문제로 나누어 푸는 문제를 일컫는 것으로 쉽게 말해 답을 재활용하는 기법이다.
성립되기 위한 두가지 조건은 다음과 같다.
- Overlapping Subproblem
큰 문제를 작은 문제로 나누었을 때, 작은 단위로 나누어진 문제들은 같은 정답의 형태가 되어야 한다. - Optimal Substruction
작은 부분에서 구한 최적의 답으로 큰 문제의 최적의 답을 구할 수 있어야 한다.
다시 문제로 돌아와 경우의 수를 하나씩 살펴보자.
n = 4 까지 그린 후 확인해보면 일정한 패턴이 반복됨을 알 수 있다.
노란색으로 체크된 n - 1 타일에 세로 타일이 하나 추가된 모습이고,
파란색으로 체크된 n - 2 타일에 가로 타일이 두개 추가된 형태를 가지고 있다.
즉, dp[n] = dp[n - 1] + dp[n - 2] 라는 점화식을 갖게 된다.
풀이
import java.io.*;
public class Main {
public static void makeTile(int n) {
int[] dp = new int[1001];
dp[1] = 1; dp[2] = 2;
for(int i = 3; i <= n; i++)
dp[i] = (dp[i - 1] + dp[i - 2]) % 10007;
System.out.println(dp[n]);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
makeTile(Integer.parseInt(br.readLine()));
}
}
© 참고
https://www.acmicpc.net/problem/11726
https://girawhale.tistory.com/33
11726번: 2×n 타일링
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
www.acmicpc.net
'Study > algorithm' 카테고리의 다른 글
[백준/Java] 11723 집합 (feat. 비트마스크) (0) | 2021.10.12 |
---|---|
[백준/Java/DP] 9095 1, 2, 3 더하기 (0) | 2021.10.06 |
[백준/Java] 9613 GCD 합 (feat. 유클리드 호제법) (0) | 2021.10.06 |
[백준/Java] 1676 팩토리얼 0의 개수* (0) | 2021.10.06 |
[백준/Java] 1924 2007년 (0) | 2021.08.09 |