🧫 문제 분석
✔️ 출처
📖 문제

홀 수 일때는 만들기가 불가능하다.
크기가 3X2인 벽을 채우는 경우의 수부터 시작한다. 3가지가 있다.
현재 크기(i)의 개수 = i - 2번째 크기의 개수 * 3 (이는 이전 크기의 각 구조에 오른쪽으로 3가지 타일을 두는 경우의 수)
또한 특수한 구조가 2가지씩 생긴다.

i - 2번째 크기 * 3 에 특수한 구조 2가지에 대해서 왼쪽에 붙이는 경우의 수를 더한다.
쉽게 이해해본 결과
i = 6 일때
dp [4] * 3 + dp[2] * 2 + dp[0] * 2;
dp[2] *2
dp[4]의 특수한 구조 2가지를 오른쪽에 두고 dp[2]의 구조들을 왼쪽에 채움
dp[0] * 2
dp[6]의 특수한 구조 2가지를 오른쪽에 두고, dp[0]의 구조들을 왼쪽에 채움

왜 이렇게 되냐면
원래는 d[i-2] * 3 + dp[i-2] *3 으로 왼쪽, 오른쪽을 3x2 타일로 채우는 방식을 해야하지만
중복이 너무많이 생겨버린다.
따라서 dp[i-2] * 3으로 오른쪽을 3x2타일로 채우는 방식으로 경우의 수 를 구하고
중복이 아닌 특수한 구조 2가지에 대해서 dp[i]를 구하는 경우의 수를 구하는 것이다.
🔅 문제 풀이
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
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());
if (n % 2 != 0) {
System.out.println(0);
return;
}
int[] dp = new int[n + 1];
dp[0] = 1; // 아무것도 두지 않으면 되기때문에 1가지 경우의 수가 있다.
dp[2] = 3;
// 이전 i-2 도형에 3가지(dp[2])를 오른쪽에 붙이는 모든 경우
for (int i = 4; i <= n; i+= 2) {
dp[i] = dp[i-2] * 3;
// dp[j]: 남은 왼쪽 영역을 채우는 방법의 수
// i-2k (k >= 2, k += 2) 개수 * (2k 크기의 도형의 특수한 구조 2가지)
// 각 dp[j]에 대해 오른쪽 2k 칸(i-j)을 특수한 구조 2가지를 붙일 수 있음
for (int j = i - 4; j >= 0; j -= 2) {
dp[i] += dp[j] * 2;
}
}
System.out.println(dp[n]);
}
}
❗ 오답노트 / 필요한 지식
- 복습 필수다.
'baekjoon > DP' 카테고리의 다른 글
백준 1965번 : 상자넣기 [자바] (0) | 2025.05.05 |
---|---|
백준 2225번 : 합분해 [자바] (0) | 2025.05.05 |
백준 10942번 : 팰린드롬? [자바] (0) | 2025.05.01 |
백준 9252번 : LCS2 [자바] (0) | 2025.04.30 |
백준 17070번 : 파이프 옮기기 1 [자바] (0) | 2025.03.30 |