문제 주소 : programmers.co.kr/learn/courses/30/lessons/12902
문제 확인
dp 문제로 수열식으로 풀 수 있습니다.
홀수인 경우 모든 답이 0이며 짝수인 경우 생길 수 있는 경우의 수를 체크하면 쉽게 풀 수 있습니다.
풀이
n을 2 단위로 생각하면 두 가지 종류로 나눌 수 있습니다.
- 영역이 겹치는 문양 : 매 단계에서 새로 생기는 문양
- 영역이 분리된 문양
겹치는 문양의 경우 매 단계에서 2개 추가됨
분리된 문양의 경우
따라서 n이 2 증가할 때 생각할 수 있는 경우의 수는 다음과 같습니다.
이를 수식으로 나타내면 f(n) = f(n-2) * 3 + f(n-4) * 2 + f(n-6) * 2 + .... + f(2) * 2 + 2가 됩니다.
f(n-4)부터 추가문양 만을 더하는 이유는 앞서 계산한 값들이 중복되기 때문입니다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <string>
#include <vector>
using namespace std;
int solution(int n) {
if (n % 2) return 0;
else {
unsigned long long sum = 3, prev = 3, cur = 3;
for (int i = 2; i < n; i += 2) {
cur = prev + sum * 2 + 2;
cur %= 1000000007;
prev = cur;
sum += cur;
}
return (int)(cur % 1000000007);
}
}
|
cs |
반응형
'알고리즘 문제 > [프로그래머스]' 카테고리의 다른 글
[프로그래머스] 스타 수열 (0) | 2020.12.31 |
---|---|
[프로그래머스] 4단 고음 (0) | 2020.12.04 |
[프로그래머스] 도둑질 (0) | 2020.12.03 |
[프로그래머스] 지형 이동 (0) | 2020.11.01 |
[프로그래머스] 방의 개수 (0) | 2020.11.01 |