반응형
어떻게 풀어야 할 지 참 난감한 문제였는데... 곰곰이 생각해서 겨우 풀 수 있었다.
간단히 얘기하자면, N-1번째에서 세로로 N번째 층을 더 올렸을 때의 경우의 수는 다음으로 구할 수 있다.
- N번째 층을 쌓지 않는 경우: N-1번째 층을 구하는 경우와 동일
- N번째 층을 쌓는 경우 - N-1번째 층이 쌓여있다면 거기서 단순히 N번째 층이 정해진다.
- N번째 층을 쌓는 경우 - N-1번째 층이 쌓여있지 않다면 왼쪽과 오른쪽 중 하나를 고를 수 있으므로 x2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Zoo {
static int MOD = 9901;
public static int stoi(String str) {
return Integer.parseInt(str);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = stoi(br.readLine());
long[][] dp = new long[N+1][2];
dp[1][0] = 1;
dp[1][1] = 2;
for (int i=2; i<=N; i++) {
// N번째 층을 쌓지 않는 경우는 N-1번째 까지만 쌓는 경우와 동일한 경우의 수.
dp[i][0] = (dp[i-1][0] + dp[i-1][1]) % MOD;
/*
N번째 층을 쌓는 경우의 수 :
N-1번째까지 쌓아뒀다면, 거기에 의해 하나만 더 올려진다 (dp[i-1][1])
N-1번째가 쌓이지 않았다면, 거기서 왼쪽과 오른쪽 둘을 쌓을 수 있다. (dp[i-1][0]*2)
*/
dp[i][1] = (dp[i-1][1] + dp[i-1][0]*2) % MOD;
}
System.out.println((dp[N][0]+dp[N][1]) % MOD);
}
}
로그인
www.acmicpc.net
작성일자: 2024-01-17
'컴퓨터 공학 > 백준' 카테고리의 다른 글
[백준] JAVA 자바 : 스티커 (9465번) (2) | 2024.01.23 |
---|---|
[백준] JAVA 자바 : 오르막 수 (11057번) (0) | 2024.01.23 |
[백준] JAVA 자바 : RGB거리 (1149번) (0) | 2024.01.23 |
[백준] JAVA 자바 : 합분해 (2225번) (1) | 2024.01.23 |
[백준] JAVA 자바 : 연속합 (1912번) (0) | 2024.01.23 |