목차
문제 : aoj-ASYMTILING
풀이
일단 대칭인 경우는 생각하지 않고, 2xn 타일링부터 생각해보자. dp[x]를 x번째 열까지 타일을 높는 경우의 수라 하자.
이 경우 dp[5]의 경우 아래 그림처럼 dp[4]에 2x1 타일을 놓는 경우와, dp[3]에 1x2 타일 2개를 놓는 경우가 있을 것이다.
즉, dp[x] = dp[x-1] + dp[x-2] 로 구할 수 있다. 답은 dp[n]이 된다.
그럼 다음으로 대칭인 경우를 제외해보자.
열이 홀수개일 경우 대칭인 경우는 이하처럼 중간에 2x1 타일이 있는 경우이다.
즉, dp[n]에서 dp[(n-1)/2] 를 빼주면 된다! (대칭인 경우를 빼면 되므로)
열이 짝수개인 경우엔 다음의 두 가지 경우가 있다. 따라서 대칭되는 경우를 빼주면 dp[n] - dp[n/2] - dp[n/2-1] 이 답이 된다.
코드 : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static final int MOD = 1000000007;
public static void main(String[] args) throws Exception {
int c = Integer.parseInt(br.readLine());
while (c-->0) new Main().solution();
System.out.print(sb);
}
private void solution() throws Exception {
int n = Integer.parseInt(br.readLine());
if (n <= 2) {
sb.append(0).append('\n');
return;
}
int[] arr = new int[n+1];
arr[0] = 1;
arr[1] = 1;
arr[2] = 2;
for (int i = 3; i <= n; i++) {
arr[i] = (arr[i-2] + arr[i-1]) % MOD;
}
long answer = arr[n];
if ((n%2==0)) {
answer -= arr[n/2] + arr[n/2-1];
answer += 2*MOD;
} else {
answer -= arr[(n-1)/2];
answer += MOD;
}
answer%=MOD;
sb.append(answer).append( '\n');
}
}
※ 종만북에 이미 풀이가 있는데 제 풀이를 올리는 이유는 제가 책의 풀이를 보지 않고 문제를 푼 후 제 풀이를 올리고 나서 책의 풀이를 보는 방식으로 풀어보고 싶기 때문입니다.
'Study > 알고리즘 문제해결전략(종만북)' 카테고리의 다른 글
[종만북] POLY - 폴리오미노 (자바 java) (0) | 2023.04.10 |
---|---|
[종만북] NUMB3RS - 두니발 박사의 탈옥 (자바 java) (0) | 2023.04.10 |
[종만북] PI - 원주율 외우기 (자바 java) (0) | 2023.04.02 |
[종만북] WILDCARD - Wildcard (자바 java) (0) | 2023.04.02 |
[종만북] CLOCKSYNC - Synchronizing Clocks (자바 java) (0) | 2023.03.20 |
댓글