[알고리즘] 백준 11727 2*n 타일링2 (파이썬 풀이)

    728x90

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

     

    11727번: 2×n 타일링 2

    2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다.

    www.acmicpc.net

    문제

    2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.

    아래 그림은 2×17 직사각형을 채운 한가지 예이다.

    입력

    첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)

    출력

    첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.

     

    해결코드

    n = int(input())
    li = [0,1,3]
    
    for i in range(3,1001):
        li.append(li[i-1]+li[i-2]*2)
    print(li[n]%10007)

     

    문제풀이

    바로 전에 풀었던 2*n 타일링 문제의 조금 업그레이드 된 버전 문제이다.

    채울수 있는 타일 중에 2*2 타일이 추가가 되었다는 것인데,

    사실 별 다를 것 없이 2*2타일의 경우의 수만 추가해주면 된다.

    n=1일때 경우의 수 1

    n=2일때 경우의 수 3

    n=3일때 경우의 수 5

    n=4일때 경우의 수 11....

    이렇게 진행이 되는데 쉽게 규칙을 찾을 수 있다.

    n의 경우의 수는 (n-1 경우의 수) + (n-2 경우의 수 *2)로 구할 수 있다.

     

    저번 문제에서 해결했던 코드에서 li[1]값과 li[2]값 그리고 점화식만 수정하여 제출하였는데

    계속해서 런타임에러가 떠서 아예 코드를 다른 방식으로 짰다.

     

    원래는 li라는 리스트를 1000개 모두 0으로 만들어버리고

    인덱스 값들을 업데이트하는 식으로 코드를 짰었는데

    그렇게 하면 시간이 두배로 걸리는 것 같아서

    그냥 li[0]~li[2]까지만 미리 지정해두고

    li[3]부터는 append로 계속해서 추가해주는 식으로 진행하였다.

    결과 li[n]을 10007로 나눈 나머지를 출력해주면 된다.

     

    728x90

    댓글