알고리즘

[백준 11726] 2xn 타일링 - 파이썬

Codult 2024. 1. 21. 11:33
728x90

백준 11726 - 알고리즘 분류: 다이나믹 프로그래밍


 

*풀이과정

Think! 다이나믹 프로그래밍 구현을 위해 재귀함수를 활용한다.

n개의 타일을 채울 수 있는 경우의 수를 f(n)이라고 할 때, f(n) = f(n-1) + f(n-2) 를 떠올리는 것이 핵심이다...

 

f(n) = f(n-1) + f(n-2)

이전 경우의 수에서, 1x2 타일을 추가로 이용하는지, 2x1 타일을 추가로 이용하는지를 기준으로 잡아 생각해보면 된다.

  • f(n-1)에서 한 줄이 더 늘어나 2xn 크기의 타일이 되었을 때, 한 줄만 추가되었으므로 1x2 크기의 타일만 사용할 수 있다.
  • f(n-2)에서 두 줄이 더 늘어나 2xn 크기의 타일이 되었을 때, 1x2와 2x1 크기의 타일 모두 사용가능하다.
    하지만, 1x2 크기의 타일을 사용하는 경우는 f(n-1)에 포함되므로 제외해야 한다.
    결국 2x1 크기의 타일만 사용할 수 있다.
  • 따라서, f(n)은 f(n-1)+f(n-2)와 같다.

1) 메모이제이션을 위하여, 1,001 길이의 리스트를 생성한다. (dp = [0] * 1001)

2) n이 1인 경우와 2인 경우를 저장한다. (dp[1] = 1, dp[2] = 2)

3) for 반복문을 이용하여 dp(n)을 구할 수 있다.

 

n = int(input())
# 메모이제이션을 위한 리스트 생성
dp = [0]*1001
dp[1]=1
dp[2]=2

for i in range(3, n+1):
    dp[i] = dp[i-1]+dp[i-2]


print(dp[n]%10007)
728x90

'알고리즘' 카테고리의 다른 글

[백준 4948] 베르트랑 공준 - 파이썬  (1) 2024.01.22
에라토스테네스의 체  (0) 2024.01.22
[백준 11047] 동전 0 - 파이썬  (0) 2024.01.20
[백준 1316] 그룹 단어 체커 - 파이썬  (0) 2024.01.20
그리디 알고리즘  (0) 2024.01.19