2 x nタイル


🔗 質問リンク


https://programmers.co.kr/learn/courses/30/lessons/12900

問題の説明



長方形のタイルがあり、横方向の長さは2、縦方向の長さは1です.この矩形タイルを用いて床を充填し,床の長手方向長さは2,横方向長さはnである.タイルを充填するには2つの方法があります.
1. 타일을 가로로 배치 하는 경우

2. 타일을 세로로 배치 하는 경우
矩形の横方向の長さnをパラメータとして指定した場合、解関数を完了し、矩形を埋め込む方法の数を返します.

⚠▼制限


  • 横長nは60000以下の自然数である.

  • 状況の数が多くなる可能性があるので、状況の数を1000000 7で割って残りを返してください.
  • 💡 プール(言語:Python)


    これは法則性を利用して問題を解き,最初は簡単な数列法則を発見せず,数学式を導出した.
    import math
    
    def solution(n):
        # 직사각형 세워서 다 채우는 경우를 카운트 
        answer = 1
        # n을 2로 나눈 몫, 나머지
        quo, rem = divmod(n, 2)
        
        # 2로 나눈 몫 1부터 quo까지 경우의 수 계산해서 더해줌
        for i in range(1, quo+1):
            res = n - (2*i)
            answer += math.factorial(i+res) // ( math.factorial(i) * math.factorial(res) )
        
        return answer % 1000000007
    このように解くと,答えはすべて正しいが,効率検査はタイムアウトした.
    モジュールを使用しても計算に時間がかかります.
    解答から見ると、この問題は単純なフィボナッチ数列?!どうして気づかなかったんだろう.
    時間の複雑さを減らすためには,DPを用いて解くことが正解である.
    def solution(n):
        
        # 피보나치 수열 계산 시간 줄이기 DP
        d = [0 for i in range(n+1)]
        # 피보나치 수 1, 2일 때
        d[1], d[2] = 1, 2 
    
        # 피보나치 수 n에 도달할 때까지 모두 다 계산
        for i in range(3, n+1):
            # 전의 결과들을 더해서 답을 도출하므로 나누기를 매 과정마다 해줘야 함
            d[i] = (d[i-1] + d[i-2]) % 1000000007
        
        return d[n]