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]
Reference
この問題について(2 x nタイル), 我々は、より多くの情報をここで見つけました https://velog.io/@shiningcastle/2-x-n-타일링テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol