[ Programmers / CodingTest / Python ] 2 x n 타일링

황승환·2022년 2월 11일
0

Python

목록 보기
172/498

문제 설명

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

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

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


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

제한사항

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

입출력 예

n	result
4	5

입출력 예 설명

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

접근 방법

이번 문제는 다이나믹 프로그래밍을 활용하여 해결하였다. 다이나믹 프로그래밍은 이전의 연산을 기억한 뒤에 그 결과를 미래의 연산에 이용하여 총 연산 횟수를 줄이는 효율적인 알고리즘 기법이다. 다이나믹 프로그래밍을 활용하기 위해서는 점화식을 먼저 도출해야 한다. 점화식을 도출하기 위해 경우의 수를 도식화해보았다.

이 그림을 통해 dp[0][3]의 경우 dp[0][2]+dp[1][2]의 값과 일치하는 것을 알 수 있다. dp[1][3]의 경우 dp[0][2]의 값과 일치한다. 이를 통해서 다음과 같은 점화식을 도출하였다.

dp[0][n]=dp[0][n-1]+dp[1][n-1]
dp[1][n]=dp[0][n-1]
result=dp[0][n]+dp[1][n]

점화식을 구하였으니 n번째 dp의 값의 합을 반환하면 정답을 구할 수 있다.

  • dp 리스트를 0 2*(n+1)로 채운다.
  • dp[0][1]을 1로 갱신한다.
  • dp[1][1]을 0으로 갱신한다.
  • 2부터 n까지 반복하는 for문을 돌린다.
    -> dp[0][i](dp[0][i-1]+dp[1][i-1])%1,000,000,007로 갱신한다.
    -> dp[1][i]를 dp[0][i-1]%1,000,000,007로 갱신한다.
  • 정답을 저장할 변수 answer에 (dp[0][n]+dp[1][n])%1,000,000,007의 값을 저장한다.
  • answer를 반환한다.

solution.py

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

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글