-
[Baekjoon Online Judge] 11726번: 2xn 타일링문제 풀이/Baekjoon Online Judge 2021. 1. 30. 17:36
11726번: 2×n 타일링
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
www.acmicpc.net
요구사항
- 2 x n 크기의 직사각형을 1 x 2, 2 x 1 타일로 채우는 방법의 수를 구한다.
입력
- 첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
출력
- 첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
점화식을 구하기 위해 실제로 타일을 그려보았다.
규칙을 찾았고, 적용하여 코드를 작성하였다. 한 가지 더 고려 해야 할 점은 채우는 방법의 수를 10007로 나눈 나머지를 dp 테이블에 저장한다. n의 크기가 커질 수록 채우는 수가 기하급수적으로 늘어서 int의 표현 범위를 넘을 것을 우려 한 것 같다.
또한 dp 테이블을 2크기 더 잡은 이유는, n에 1의 값이 들어오면 밑에 나오는 dp[2] = 2를 실행 할 때, index 범위를 초과하기 때문에 크기를 늘려주었다.
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class Baekjoon11726 { static int[] dp; public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out)); int n = Integer.parseInt(bufferedReader.readLine()); dp = new int[n + 2]; dp[1] = 1; dp[2] = 2; for (int i = 3; i <= n; i++) { dp[i] = (dp[i - 1] + dp[i - 2]) % 10007; } bufferedWriter.write(String.valueOf(dp[n])); bufferedWriter.flush(); bufferedReader.close(); bufferedWriter.close(); } }
규칙만 찾으면 간단하게 해결할 수 있는 문제였다.
'문제 풀이 > Baekjoon Online Judge' 카테고리의 다른 글
[Baekjoon Online Judge] 2579번: 계단 오르기 (0) 2021.01.30 [Baekjoon Online Judge] 1149번: RGB거리 (0) 2021.01.30 [Baekjoon Online Judge] 1003번: 피보나치 함수 (0) 2021.01.29 [Baekjoon Online Judge] 9095번: 1, 2, 3 더하기 (0) 2021.01.28 [Baekjoon Online Judge] 1463번: 1로 만들기 (0) 2021.01.27