가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 다음과 같이 2가지 방법이 있습니다.
예를들어서 n이 7인 직사각형은 다음과 같이 채울 수 있습니다.
직사각형의 가로의 길이 n이 매개변수로 주어질 때, 이 직사각형을 채우는 방법의 수를 return 하는 solution 함수를 완성해주세요.
n result
4 5
입출력 예 #1
다음과 같이 5가지 방법이 있다.
이번 문제는 다이나믹 프로그래밍을 활용하여 해결하였다. 다이나믹 프로그래밍은 이전의 연산을 기억한 뒤에 그 결과를 미래의 연산에 이용하여 총 연산 횟수를 줄이는 효율적인 알고리즘 기법이다. 다이나믹 프로그래밍을 활용하기 위해서는 점화식을 먼저 도출해야 한다. 점화식을 도출하기 위해 경우의 수를 도식화해보았다.
이 그림을 통해 dp[0][3]
의 경우 dp[0][2]+dp[1][2]
의 값과 일치하는 것을 알 수 있다. dp[1][3]
의 경우 dp[0][2]
의 값과 일치한다. 이를 통해서 다음과 같은 점화식을 도출하였다.
dp[0][n]=dp[0][n-1]+dp[1][n-1]
dp[1][n]=dp[0][n-1]
result=dp[0][n]+dp[1][n]
점화식을 구하였으니 n번째 dp의 값의 합을 반환하면 정답을 구할 수 있다.
dp[0][1]
을 1로 갱신한다.dp[1][1]
을 0으로 갱신한다.dp[0][i]
를 (dp[0][i-1]+dp[1][i-1])%1,000,000,007
로 갱신한다.dp[1][i]를 dp[0][i-1]%1,000,000,007
로 갱신한다.(dp[0][n]+dp[1][n])%1,000,000,007
의 값을 저장한다.def solution(n):
dp=[[0]*(n+1) for _ in range(2)]
dp[0][1]=1
dp[1][1]=0
for i in range(2, n+1):
dp[0][i]=(dp[0][i-1]+dp[1][i-1])%1000000007
dp[1][i]=dp[0][i-1]%1000000007
answer=(dp[0][n]+dp[1][n])%1000000007
return answer