코딩테스트

[BOJ_1309/JAVA] 동물원

Eun 2022. 1. 21. 13:42

문제

풀이

두칸을 기준으로

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);
	}

}