자료구조/문제풀이
[백준 JAVA] 11727 2xn 타일링 2
휴먼코딩
2024. 8. 29. 00:22
11727 2xn 타일링 2
https://www.acmicpc.net/problem/11727문제설명
주어진 정수 n에 대해 2xN 크기의 타일을 1x2 또는 2x1 크기의 타일로 채우는 경우의 수를 계산한다.
접근방식
O(n) 시간복잡도
DP 배열은 상수 시간을 가진다.
문제 조건 분석 과정
dp[i]: 2xi 크기의 직사각형을 채우는 방법의 수를 저장한다.
dp[i] = dp[i-1] + 2 * dp[i-2]
- dp[i-1]은 마지막에 1x2 타일 하나를 수직으로 놓은 경우
- 2 * dp[i-2]는 마지막 두 열에 2x1 타일을 수평으로 놓은 경우와 두 개의 1x2 타일을 수평으로 놓은 경우이다.
전체코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine().trim());
// 결과를 모듈로 나눈 나머지를 저장하기 위한 상수
final int MOD = 10007;
//dp[i]로 i 칸을 채우는 방법의 수를 저장
int[] dp = new int[n + 1];
// 기본 케이스: dp[0] = 1 (0 칸을 채우는 경우는 1가지) 및 dp[1] = 1 (1 칸을 채우는 경우는 1가지)
dp[0] = 1;
dp[1] = 1;
// 동적 프로그래밍을 이용하여 dp 배열을 채움
// i가 2부터 n까지 반복
for (int i = 2; i <= n; i++) {
// dp[i] = 두가지 경우의 수 고려
// 1. (i-1)번째 칸을 채우고, 마지막에 1x2 타일을 추가하는 경우
// 2. (i-2)번째 칸을 채우고, 마지막에 2x2 타일을 추가하는 경우 (2개가 필요함)
dp[i] = (dp[i - 1] + 2 * dp[i - 2]) % MOD;
}
//n 칸을 채우는 방법의 수 출력
System.out.println(dp[n]);
}
}