Post

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

img

3x12 벽을 타일로 채운 예시

  • 사실 구현자체는 어렵지 않지만, 타일을 채우는 방법이 독특해서 따로 정리하기로 했다. 아마 문제 아래 주어지는 힌트가 없었다면 한참 헤맸을 것 같다.

풀이

  • 타일을 배치하는 경우의 수는 다음과 같다.

img

  • 즉 i번째 칸에서 배치할 수 있는 경우의 수는 아래와 같이 표현할 수 있다.

(i-2칸에서 경우의 수 * 3) + (i-4칸에서 경우의 수 * 2) + (i-6칸에서 경우의 수 * 2) + …

  • 또한 벽의 가로 길이가 짝수인 경우에만 배치가 가능하므로, 문제에서 주어진 N이 홀수인 경우 답은 무조건 0이 된다.

코드

정직하게 for문 돌기

1
2
3
4
5
6
7
8
9
10
if __name__ == "__main__":
    N = int(input())
    dy = [0] * (N+1)
    dy[0] = 1
    for i in range(2, N+1):
        dy[i] = dy[i-2] * 3
        for j in range(i-4, -1, -2):
            dy[i] += dy[j] * 2
    dy[0]= 0
    print(dy[N])

i가 홀수일 때는 0임을 감안하고 슬라이싱 이용하기

1
2
3
4
5
6
7
8
9
if __name__ == "__main__":
    N = int(input())
    dy = [0] * (N+2)
    dy[0] = 1
    dy[2] = 3
    for i in range(4, N+1, 2):
        dy[i] = dy[i-2] * 3 + sum(dy[:i-2]) * 2
    dy[0] = 0
    print(dy[N])

백준 기준으로, 두방법은 동일한 시간이 걸린다.

This post is licensed under CC BY 4.0 by the author.