728x90
문제출처 - https://programmers.co.kr/learn/courses/30/lessons/12900?language=cpp
-문제-
가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 다음과 같이 2가지 방법이 있습니다.
- 타일을 가로로 배치 하는 경우
- 타일을 세로로 배치 하는 경우
예를들어서 n이 7인 직사각형은 다음과 같이 채울 수 있습니다.
직사각형의 가로의 길이 n이 매개변수로 주어질 때, 이 직사각형을 채우는 방법의 수를 return 하는 solution 함수를 완성해주세요.
제한사항
- 가로의 길이 n은 60,000이하의 자연수 입니다.
- 경우의 수가 많아 질 수 있으므로, 경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요.
입출력 예
n | result |
4 | 5 |
-설명-
1. 딱봐도 뭔가 규칙성을 찾아서 풀어야하는 다이나믹프로그래밍 문제의 일종이다.
2. 점화식을 찾기위해 역으로 접근해보면,
우리는 현재 F(N)을 구해야하는 상황이다.
A. F(N-1)은 F(N)에 도달하기 위해 막대가 1개 부족하다. 따라서 마지막에 1개의 막대를 추가하는 방법이있다.
B. F(N-2)은 F(N)에 도달하기 위해 막대가 2개 부족하다. 따라서 마지막에 2개의 막대를 가로, 2개의 막대를 세로로 추가하는 방법이있는데, 세로로 추가하는 경우는 위의 경우에 수와 중복된다.
C. F(N-3)은 F(N)에 도달하기 위해 막대가 3개 부족하다. 경우의 수는 다음과 같다.
F(N-3)부터는 이미 F(N-1)과 F(N-2)에서 고려를 하는 상황이기 때문에 신경을 써줄 필요가없다.
따라서 F(N) = F(N-1) + F(N-2) 라는 점화식이나온다.
-코드-
def solution(n):
dp=[0 for i in range(60001)]
dp[1] = 1
dp[2] = 2
dp[3] = 3
for i in range(4,n+1):
dp[i]= (dp[i-1]+dp[i-2])%1000000007
answer = dp[n]
return answer
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 섬 연결하기(Level 3)/Wanna Be 컴잘알 (0) | 2020.04.24 |
---|---|
프로그래머스 - 타일 장식물(Level 3)/Wanna Be 컴잘알 (0) | 2020.04.24 |
프로그래머스 - 행렬의 곱셈(Level 2)/Wanna Be 컴잘알 (0) | 2020.04.18 |
프로그래머스 - 폰켓몬(Level 2)/Wanna Be 컴잘알 (0) | 2020.04.17 |
프로그래머스 - 땅따먹기(Level 2)/Wanna Be 컴잘알 (0) | 2020.04.17 |