알고리즘/백준

공부 144일차: 백준 2133번 타일 채우기 자바 java

김발자~ 2022. 12. 21. 20:05
반응형

2133 타일 채우기

https://www.acmicpc.net/problem/2133

 

2133번: 타일 채우기

3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자.

www.acmicpc.net

 

 

 


백준 2133번 문제 타일 채우기


문제


 

 

 

 


과정 생각해보기 & 오답


 

https://gimbalja.tistory.com/238

 

공부 121일차: 백준 11726번 2Xn 타일링 자바 java

11726 2Xn 타일링 https://www.acmicpc.net/problem/11726 11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채

gimbalja.tistory.com

이 문제와 비슷해 보이지만 훨씬 복잡하다

 

일단 n이 홀수면 절대 완성될 수 없으므로, 홀수인 경우는 모두 0이다

 

그림을 그려보면 다음과 같다

 

그래서 단순하게 점화식은 dp[i] = dp[i-2] * 3 으로 생각했다가 틀린 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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());
        int[] dp = new int[n+1];
        dp[0= 1;    // dp[2] = dp[0]*3 = 3 -> dp[0] = 1(아무것도 채우지 않는 경우를 1로 보자고 친다)
        
        for(int i = 2; i < n+1; i+=2) {
            dp[i] = dp[i-2* 3;
        }
 
        System.out.println(dp[n]);
    }
 
}
cs

 

https://yabmoons.tistory.com/536

이 블로그의 설명이 자세해서 도움을 많이 받았다

 

틀린 이유는 3x4일 때, 9가 아니라 11이기 때문이다

이 두 모양이 변수로 작용한다

 

그래서 위의 문제에서 높이만 +1 된 거니까 아래에 2x1 블럭을 놓는다고 가정해도 괜찮다고 생각했는데, 이것 역시 변수가 너무 많았다(3x4로 가정할 때부터 이미 맞지 않았다)

 

최종 점화식은

dp[i] = dp[i-2]*3 + (dp[i-4]*2) + (dp[i-6]*2) + (dp[i-8]*2) + ... (dp[0]*2)

 

 

 

 

 


정답 인정 코드


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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());
        int[] dp = new int[n+1];
        dp[0= 1;    // dp[2] = dp[0]*3 = 3 -> dp[0] = 1(아무것도 채우지 않는 경우를 1로 보자고 친다)
        
        for(int i = 2; i < n+1; i+=2) {
            dp[i] = dp[i-2* 3;
            for(int j = i-4; j >= 0; j-=2) {
                dp[i] = dp[i] + (dp[j]*2);
                // 점화식 : dp[i] = dp[i-2]*3 + (dp[i-4]*2) + (dp[i-6]*2) + (dp[i-8]*2) + ... (dp[0]*2) 
                // == dp[i] = dp[i] + (dp[i-4]*2) + (dp[i-6]*2) + (dp[i-8]*2) + ... (dp[0]*2)
            }
        }
 
        System.out.println(dp[n]);
    }
 
}

cs

 

점화식 구하는 과정이 매우 복잡했던 문제다

 

 

 

 


 

반응형