[코딩테스트] 프로그래머스 Lv2. 2 x n 타일링(DP)

2026.02.03. 15:25

문제 설명

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

  • 타일을 가로로 배치 하는 경우

  • 타일을 세로로 배치 하는 경우

예를들어서 n이 7인 직사각형은 다음과 같이 채울 수 있습니다.

Imgur

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

입출력 예

nresult45

입출력 예 설명

입출력 예 #1
다음과 같이 5가지 방법이 있다.

Imgur

Imgur

Imgur

Imgur

Imgur

해답

def solution(n):
    answer = 0
    
    #dp[i] = 길이가 i일 때 경우의 수
    #dp[1] = 1
    #dp[2] = 2
    #dp[3] = 3 # dp[1] + dp[2]
    #dp[4] = 5 # dp[3] + dp[2]
    if n == 1 :
        return 1
    if n == 2 :
        return 2
    
    dp = [0]*(n+1)
    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]
    

풀이 

일단 처음으로 GPT에 의존하지 않고 내 힘으로 풀어냈다. 

일단 주어진 n = 4 일때 5가지의 방법을 자세하게 살펴보면 

dp[4] = dp[3]+dp[2] 꼴이었고

dp[3] = dp[2]+dp[1] 형태였다. 

이렇게 점화식을 세운 뒤 

def solution(n):
    answer = 0
    
    #dp[i] = 길이가 i일 때 경우의 수
    #dp[1] = 1
    #dp[2] = 2
    #dp[3] = 3 # dp[1] + dp[2]
    #dp[4] = 5 # dp[3] + dp[2]
    if n == 1 :
        return 1
    if n == 2 :
        return 2
    
    dp = [0]*(n+1)
    dp[1] = 1
    dp[2] = 2
    for i in range(3, n+1):
        dp[i] = dp[i-1]+dp[i-2]
    
    return dp[n]%1000000007
    

이렇게 풀었는데 문제가 있었다. 

정확성은 합격하나 효율성에서 실패했다. 따라서 매 연산 마다 나머지 연산을 미리 적용하니 통과했다. 

(dp[i-1]+dp[i-2])%1000000007

# 참고로 밑의 식은 안된다.
dp[i-1]%1000000007+dp[i-2]%1000000007