프로그래머스- 2 x n 타일링

Hank Kim·2022년 7월 4일
0

알고리즘 문제풀이

목록 보기
23/24
post-thumbnail

문제 설명

가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 다음과 같이 2가지 방법이 있습니다.

타일을 가로로 배치 하는 경우
타일을 세로로 배치 하는 경우
직사각형의 가로의 길이 n이 매개변수로 주어질 때, 이 직사각형을 채우는 방법의 수를 return 하는 solution 함수를 완성해주세요.

제한사항

가로의 길이 n은 60,000이하의 자연수 입니다.
경우의 수가 많아 질 수 있으므로, 경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요.

풀이

def solution(n):
    dp = [0] * 60001
    dp[1] = 1
    dp[2] = 2
    for i in range(3,n+1):
        dp[i] = (dp[i-1] + dp[i-2])% 1000000007

    return dp[n]

Dynamic programming 문제.

dp[1]은 다 차고 한칸이 비었을 때의 발생가능한 경우의 수
dp[2]는 두칸이 비었을때의 경우의 수. 세로로 2개거나 가로로 2개.
dp[3] = 3 이고 dp[2] + dp[1]과 같다
dp[4] = 5 이고 dp[3] + dp[2]와 같다.
.
.
점화식 dp[i] = dp[i-1] + dp[i-2]를 발견할 수 있다!

return dp[n]%1000000007하면 시간초과가 난다.
너무 큰 수를 연산해서 그렇다
(dp[i-1] + dp[i-2])% 1000000007처럼 나눠준 값을 저장해주면 된다.

주소
https://programmers.co.kr/learn/courses/30/lessons/12900?language=python3

profile
JavaScript, Python Algorithm

0개의 댓글