[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 3 x n 타일링 / 파이썬
Problem Solving πŸ”₯/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 3 x n 타일링 / 파이썬

programmers.co.kr/learn/courses/30/lessons/12902#

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - 3 x n 타일링

 

programmers.co.kr

μ²˜μŒμ—λŠ” λ„ˆλ¬΄ μ‰½κ²Œ μƒκ°ν–ˆλ‹€.
처음 μƒκ°ν•œ 점화식은 dp[i] = dp[i-2] * 3 + dp[i-4] * 2 μ˜€λ‹€.
ν•˜μ§€λ§Œ μ˜€λ‹΅μ΄ λ‚œ μˆœκ°„ 무언가λ₯Ό λΉΌλ¨Ήμ—ˆλ‚˜ λΌλŠ” 생각을 ν•˜κ²Œλ˜μ—ˆκ³ , λ‚˜λ¦„ μ‰½κ²Œ κ·œμΉ™μ„ 찾을 수 μžˆμ—ˆλ‹€.

μš°μ„  n이 ν™€μˆ˜μΈ 경우λ₯Ό μƒκ°ν•΄λ³΄μž

3 x ν™€μˆ˜ => ν™€μˆ˜ 이닀.
즉 ν™€μˆ˜μΈ κ²½μš°λŠ” ν™€μˆ˜κ°€ λ‚˜μ˜€λ―€λ‘œ, 길이가 2인 νƒ€μΌλ“€λ‘œλŠ” μ±„μš°λŠ” 것이 λΆˆκ°€λŠ₯함이 자λͺ…ν•˜λ‹€.

짝수인 경우λ₯Ό μƒκ°ν•΄λ³΄μž.
짝수λ₯Ό n이라고 κ°€μ •ν•΄λ³΄μž.
μš°μ„  2개둜 λ§Œλ“€ 수 μžˆλŠ”κ±΄ 그렀보면 3κ°œκ°€ λ‚˜μ˜¨λ‹€.
κ·ΈλŸ¬λ‹ˆ n-2개둜 λ§Œλ“€ 수 μžˆλŠ” 수 * 3으둜 λ§Œλ“€ 수 μžˆλ‹€.

그리고 이게 그렀보면 μž¬λ°ŒλŠ”κ²Œ λ‚˜μ˜€λŠ”λ°
길이가 4인 νƒ€μΌλ‘œ λ§Œλ“€ 수 μžˆλŠ” μ΄μƒν•œ λͺ¨μ–‘이 두 개 λ‚˜μ˜¨λ‹€.
길이가 6인 νƒ€μΌλ‘œ λ§Œλ“€ 수 μžˆλŠ” μ΄μƒν•œ λͺ¨μ–‘이 두 개 λ‚˜μ˜¨λ‹€.
길이가 8인 ..
길이가 2*k인 νƒ€μΌλ‘œ λ§Œλ“€ 수 μžˆλŠ” μ΄μƒν•œ λͺ¨μ–‘이 두 개 λ‚˜μ˜¨λ‹€.

이제 κ·œμΉ™μ„ μ°Ύμ•˜λ‹€.

dp[i] = dp[i-2] * 3 + for n in range(2, i+1, 2) { dp[i-n] * 2 } μž„μ΄ 확싀함을 μ•Œ 수 μžˆλ‹€.

def solution(n):
    MOD = 1000000007
    answer = 0
    if n % 2 == 1:
        return 0
    dp = [0 for _ in range(n+1)]
    dp[0] = 1
    dp[2] = 3
    for i in range(4, n+1, 2):
        dp[i] = (dp[i-2] * 3)
        for j in range(4, i+1, 2):
            dp[i] += (dp[i-j] * 2)
        dp[i] %= MOD
    return dp[n]