알고리즘

백준 1309번 동물원 (JAVA)

박카스마시며코딩 2021. 12. 14. 12:31

https://www.acmicpc.net/problem/1309

 

1309번: 동물원

첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.

www.acmicpc.net

 

저는 DP를 적용하여 문제를 해결하였습니다. 

0번째 인덱스는 해당 라인에 사자를 넣지 않는 것으로 설정하였습니다. 해당 라인에 아무것도 없다면 이전 인덱스의 1,2 둘 다 가능하기 때문에 dp[n][0] = dp[n-1][0] + dp[n-1][1] + dp[n-1][2] 으로 점화식을 만들었습니다.

해당 라인에 왼쪽 (1)에 사자를 넣으면 이전 인덱스에서 2만 넣을 수 있기 때문에 점화식
dp[n][1] = dp[n-1][0] + dp[n-1][2] 으로 만들었습니다.

오른쪽(2) 도 위와 같은 방식으로 점화식을 만들면

dp[n][2] = dp[n-1][0] + dp[n-1][1]입니다. 

저는 이렇게 점화식을 만들어서 DP를 적용하여 문제 해결 하였습니다.

 

 

 

package BOJ;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class BOJ_1309 {
    static int dp[][];
    static int n;
    static final int LIMIT = 9901;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        dp = new int[n+5][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]) % LIMIT;
            dp[i][1] = (dp[i-1][0] + dp[i-1][2]) % LIMIT;
            dp[i][2] = (dp[i-1][0] + dp[i-1][2]) % LIMIT;
        }
        int result = (dp[n][0] + dp[n][1] + dp[n][2]) % LIMIT;
        System.out.println(result);
    }
}