이번 문제는 다이나믹 프로그래밍을 통해 해결하였다. 메모라이제이션을 2*1, 1*2, 2*2를 가장 왼쪽이 붙이는 경우로 나눠서 진행하였다.
dp[0][i]를 2*1, dp[1][i]를 1*2, dp[2][i]를 2*2로 설정하였다. 이를 점화식으로 나타내면 다음과 같이 나타낼 수 있다.
dp[0][n]=dp[0][n-1]+dp[1][n-1]+dp[2][n-1]
dp[1][n]=dp[0][n-1]
dp[2][n]=dp[0][n-1]
결과는 dp[0][n]+dp[1][n]+dp[2][n]
의 값이다.
dp[0][1]
을 1로 갱신한다. (2*1 타일링의 경우 2*1 타일로만 채울 수 있으므로)dp[0][i]
를 (dp[0][i-1]+dp[1][i-1]+dp[2][i-1])%10007
로 갱신한다.dp[1][i]
와 dp[2][i]
를 dp[0][i-1]
로 갱신한다.(dp[0][n]+dp[1][n]+dp[2][n])%10007
을 출력한다.n=int(input())
dp=[[0]*(n+1) for _ in range(3)]
dp[0][1]=1
for i in range(2, n+1):
dp[0][i]=(dp[0][i-1]+dp[1][i-1]+dp[2][i-1])%10007
dp[1][i], dp[2][i]=dp[0][i-1], dp[0][i-1]
print((dp[0][n]+dp[1][n]+dp[2][n])%10007)