문제
풀이
두칸을 기준으로
1. 사자가 한마리도 없을 때
2. 사자가 왼쪽에 있을 때
3. 사자가 오른쪽에 있을 때
로 나누어야한다.
그 전 두칸에서의 경우의 수 + 두칸이 추가되었을 때 경우의 수를 구하면 된다.
dp[1][0]=1;
dp[1][1]=1;
dp[1][2]=1;
N이 1일때는 1로 동일하므로 초기화를 시켜준다.
그리고 두칸이 추가되었을 때는
1) 사자가 한마리도 없을 때, dp[2][0]=dp[1][0]+dp[1][1]+dp[1][2]
2) 사자가 왼쪽에 있을 때, dp[2][1]=dp[1][0]+dp[1][2]
(위아래로 배치되면 안되기때문에 전 칸에서 아무것도 배치되지 않을 때+사자가 오른쪽에 있을 때)
3) 사자가 오른쪽에 있을 때, dp[2][2] = dp[1][0]+dp[1][1]
(전 칸에서 아무것도 배치되지 않을 때 + 사자가 오른쪽에 있을 때)
따라서 점화식은
dp[i][0]=dp[i-1][0]+dp[i-1][1]+dp[i-1][2]
dp[i][1]=dp[i-1][0]+dp[i-1][2]
dp[i][2]=dp[i-1][0]+dp[i-1][1]
가 된다.
이것을 코드로 구현해보자.
코드
package Week08;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BOJ1309 {
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
final int mod = 9901;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int dp[][] = new int[n+1][3];
dp[1][0]=1;
dp[1][1]=1;
dp[1][2]=1;
for(int i=2;i<=n;i++) {
dp[i][0]=(dp[i-1][0]+dp[i-1][1]+dp[i-1][2])%mod;
dp[i][1]=(dp[i-1][0]+dp[i-1][2])%mod;
dp[i][2]=(dp[i-1][0]+dp[i-1][1])%mod;
}
System.out.println((dp[n][0]+dp[n][1]+dp[n][2])%mod);
}
}
'코딩테스트' 카테고리의 다른 글
[이코테/JAVA] Greedy - 큰 수의 법칙 (0) | 2022.01.23 |
---|---|
[BOJ_3085/JAVA] 사탕 게임 (0) | 2022.01.22 |
[BOJ_2225/JAVA] 합분해 (0) | 2022.01.21 |
[BOJ_14002/JAVA]가장 긴 증가하는 부분 수열 4 (0) | 2022.01.16 |
[BOJ_1912/JAVA] 연속합 (0) | 2022.01.12 |