728x90
반응형
📌 문제 설명
가로 길이가 2이고 세로의 길이가 1인 직사각형 모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 3이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 다음과 같이 2가지 방법이 있습니다
- 타일을 가로로 배치 하는 경우
- 타일을 세로로 배치 하는 경우
예를들어서 n이 8인 직사각형은 다음과 같이 채울 수 있습니다.
직사각형의 가로의 길이 n이 매개변수로 주어질 때, 이 직사각형을 채우는 방법의 수를 return 하는 solution 함수를 완성해주세요.
📌 제한 사항
- 가로의 길이 n은 5,000이하의 자연수 입니다.
- 경우의 수가 많아 질 수 있으므로, 경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요.
🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12902
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
반응형
728x90
👩💻 코드
#include <string>
#include <vector>
using namespace std;
int solution(int n) {
if(n % 2 == 1){
return 0;
}
vector<long long> dp(n + 1, 0);
dp[0] = 1;
dp[2] = 3;
for (int i = 4; i <= n; i += 2) {
dp[i] = (3 * dp[i - 2]) % 1000000007;
for (int j = i - 4; j >= 0; j -= 2) {
dp[i] = (dp[i] + 2 * dp[j]) % 1000000007;
}
}
return (int) dp[n];
}
📝 풀이
우선 길이가 홀수인 경우는 채울 수 없기 때문에 0을 return 합니다.
길이가 2일 때 기본적인 가로와 세로 타일 배치는 3가지이기 때문에 dp[i] = 3 * dp[i-2] 입니다.
길이가 4이상인 경우는 대칭적인 패턴이 추가로 존재하기 때문에 각각 두가지 씩의 경우의 수가 추가됩니다.
따라서 2 * dp[i- 4], 2 * dp[i-6] ... 패턴의 경우의 수를 누적해야됩니다.
최종적으로 구해진 dp[n]의 값을 return하면 됩니다.
728x90
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 유사 칸토어 비트열 (0) | 2024.11.12 |
---|---|
[프로그래머스] 야근 지수 (0) | 2024.11.11 |
[프로그래머스] 교점에 별 만들기 (2) | 2024.11.09 |
[프로그래머스] 카카오프렌즈 컬러링북 (0) | 2024.11.08 |
[프로그래머스] 택배 배달과 수거하기 (1) | 2024.11.05 |