문제 링크 : programmers.co.kr/learn/courses/30/lessons/12902
세로길이는 3으로 고정이므로 가로길이가 2일 때 경우의 수는 3가지
가로 길이 2가 추가될 때
A : 전 단계의 경우의 수 x 3
B : 위 그림과 같이 짝수 지점을 직사각형이 끼고 있을 때 2가지 경우의 수
A와 B를 생각하면서 수식을 만들어보면
가로 길이 0일 때(d[0]) : 1 이라고 가정하자
가로 길이 2일 때(d[2]) : 3 x d[2 - 2] + 2 x 0
가로 길이 4일 때(d[4]) : 3 x d[4 - 2] + 2 x d[2 - 2]
가로 길이 6일 때(d[6]) : 3 x d[6 - 2] + 2 x d[4 - 2]
......
가로 길이 n일 때(d[n]) : 3 x d[n - 2] + 2 x d[n - 2 - 2]
#include <string>
#include <vector>
#include <string.h>
using namespace std;
long long cache[5001];
const int MOD_NUMBER = 1000000007;
long long tiling(int num)
{
long long& returnValue = cache[num];
if(returnValue != 0){ return returnValue; }
// 가로 길이가 2 늘어날때 마다 경우의 수가 3배 생기고
returnValue += 3 * tiling(num - 2);
// 짝수 지점마다 위쪽, 아래쪽 두가지 경우가 생김
for(int index = 4; index <= num; index += 2)
{
returnValue += 2 * tiling(num - index);
}
returnValue %= MOD_NUMBER;
return returnValue;
}
int solution(int n) {
memset(cache, 0, sizeof(cache));
cache[0] = 1; cache[2] = 3;
int answer = tiling(n);
return answer;
}
'알고리즘' 카테고리의 다른 글
[프로그래머스] 줄 서는 방법 (C/C++) (0) | 2020.12.22 |
---|---|
[프로그래머스] 멀쩡한 사각형 (C/C++) (0) | 2020.12.21 |
[프로그래머스] 도둑질 (C/C++) (0) | 2020.12.20 |
[프로그래머스] 가사 검색 (C/C++) (0) | 2020.12.19 |
[프로그래머스] 4단 고음 (C++) (0) | 2020.12.18 |
댓글