본문 바로가기

Study/Algorithm

[BOJ] 2133 - 타일 채우기

[BOJ] 2133 - 타일 채우기

문제

문제

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

입력

첫째 줄에 N(1 ≤ N ≤ 30)이 주어진다.

출력

첫째 줄에 경우의 수를 출력한다.

예제 입력

2

예제 출력

3

문제 해결

3xn 크기 벽을 채우는 것이다. 준비된 타일은 2x1 타일 이고, 따라서 (n==홀)수 일때의 경우의 수는 0인것을 알 수 있다.

그럼 이제 n 이 짝수일때 경우의 수를 따져보자.

2인 경우애는 총 3개이다.

12  11  11
12  22  23
33  33  23

그럼 4개인 경우에는 2인 경우에 2개를 붙인 경우이므로 3 * 3 에다가 3x4을 만들 수 있는 경우 2가지가 추가된다.

1122 1224
3446 1334
3556 5566

따라서 총 11가지이다.

그럼 6개일때는 위 과정과 똑같이 2인 경우 * 3x4 경우 + 4인 경우 3x2 경우 에 3x6을 만들 수 있는 케이스가 존재한다.

따라서 n의 경우의 수는 n까지의 짝수의 경우의 수 * 특정 3xn 블럭을 만들수 있는 경우의 수
n 이 2일때는 3개, 나머지는 2개 + n 단계에서 특별하게 만들 수 있는 2가지 경우를 더한 값이 된다.

python 코드

n = int(input())
dp = [0] * (n+1)

for i in range(1, n+1):
    if i % 2 == 1 :
        dp[i] = 0
    elif i == 2 :
        dp[i] = 3
    else :
        temp = 0
        for j in range(2, i-1):
            if j == i-2 :
                temp += dp[j] * 3
            elif j % 2 == 0 :
                temp += dp[j] * 2
        dp[i] = temp + 2

print(dp[n])

Test case

n=2 3
n=3 0
n=4 11
n=5 0
n=6 41
n=7 0
n=8 153

느낀점

특정 케이스에서 어떤 수 가 추가된다는 것을 인지하지 못하여 조금 오래 걸렸던 문제이다.

'Study > Algorithm' 카테고리의 다른 글

[BOJ] 2225 - 합분해  (0) 2019.06.04
[BOJ] 2011 - 암호코드  (0) 2019.06.04
[BOJ] 2294 - 동전 2  (0) 2019.05.02
[BOJ] 2293 - 동전 1  (0) 2019.04.30
[BOJ] 14501 - 퇴사  (0) 2019.04.30