1 minute read



문제 풀이


이 문제는 동적 계획법(DP)를 이용해 풀 수 있는 문제이다.


아이디어 도출

이번 문제는 이전에 풀었던 2xn 타일링 문제와 흠사한 방법으로 풀 수 있다.

2xn 타일링 문제가 피보나치 수열의 형태를 띄고있었다면 이번에는 그 형태가 다르다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
N=1
1x2 => |
 1가지의 방법

N=2
2x2 => 
1x2 => ||
2x1 => =
 3가지의 방법

N=3
2x2, 1x2 => |, |
1x2, 2x1 => |||, =|, |=
 5가지의 방법

위 내용을 잘 살펴보면, N이 3일 때는 N=2일 때 타일에 2x1 타일이 세로로 하나 붙은 형태를 가지고 있고, N=1일 때 타일에 2x1 타일이 가로로 2개 붙어있거나, 2x2 타일이 붙은 형태를 지니고 있음을 알 수 있다.

이전 문제에서는 N-2의 타일에 붙이는 타일은 2x1 타일을 가로로 2개 붙인 경우만 가능했었으나, 2x2 타일이 추가되면서 경우의 수가 늘어났다고 볼 수 있다.

따라서, 점화식은 다음과 같이 표현할 수 있다.

dp[n]=dp[n−1]+2×dp[n−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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.io.*;

class Main {    

    // DP 테이블 선언
    static int[] D;

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int N = Integer.parseInt(br.readLine());

        D = new int[N+1];
        for(int i=0; i<=N; i++) {
            D[i] = -1;
        }

        // 2X0은 0가지, 2X1은 1가지, 2X2은 3가지 경우의 수가 있다.
        D[0] = 0;
        D[1] = 1;
        
        // N이 1일 경우가 있기 때문에 예외처리를 해준다.
        if(N > 1) {
            D[2] = 3;
        }
        
        // 재귀함수 호출한다.
        recursion(N);

          // DP 테이블에 저장된 N번째 값을 출력한다.
        bw.write(D[N]+"\n");

        bw.close();
        br.close();
    }

    /**
     * N=1일 때는 1가지, N=2일 때는 3가지, N=3일 때는 5가지의 방법이 있다.
     * 고로, 점화식은 (N-1) + 2 * (N-2)가 된다.
     */
    static int recursion(int N) {
        if(D[N] != -1) {
            return D[N];    
        }
        return D[N] = (recursion(N-1) + (2 * recursion(N-2))) % 10007;
    }

}

출처


  • 해당 문제의 저작권은 문제를 만든이에게 있으며 자세한 내용은 문제 링크에서 참조바랍니다.