1층이 밑면이 길이 인 사다리꼴, 평행사변형이 되는 경우를 sadari[n]
, pyeong[n]
이라 하자.
이때, sadari[i]
는 다음과 같이 2가지 경우가 있다.
pyeong[i]
의 오른쪽에 삼각형을 추가sadari[i-1]
의 오른쪽에 평행사변형(+ 필요하다면 2층) 추가pyeong[i]
는 2층의 여부(tops[i-1] == 1
)에 따라 2가지 또는 3가지 경우로 나뉜다.
sadari[i]
의 오른쪽에 삼각형(+ 필요하다면 2층) 추가pyeong[i-1]
의 왼쪽에 평행사변형(+ 필요하다면 2층) 추가sadari[i]
의 오른쪽에 마름모 추가위의 관계를 이용해 동적으로 값을 구한다. 최종적으로 구하는 값은 sadari[n+1]
이다.
class Solution {
static final int MOD = 10007;
static int[] sadari, pyeong;
static int n;
static int ans;
public int solution(int n, int[] tops) {
n = tops.length;
sadari = new int[n+2];
pyeong = new int[n+2];
sadari[1] = 1;
pyeong[1] = tops[0] == 1 ? 3 : 2;
for (int i=2; i<=n+1; i++) {
sadari[i] = add(sadari[i-1], pyeong[i-1]);
pyeong[i] = add(sadari[i], pyeong[i-1]);
if (i-1 < n && tops[i-1] == 1)
pyeong[i] = add(pyeong[i], sadari[i]);
}
return sadari[n+1];
}
static int add(int a, int b) {
return (a + b) % MOD;
}
}
sadari[n]
는 , pyeong[n]
은 이지만 문제와 큰 관련은 없었다.