알고리즘/DP

[백준] 1309번 동물원 #Java

VIPeveloper 2022. 5. 30. 11:26
728x90
반응형

내가 푼 풀이가 틀렸다고 나왔길래 정답을 찾아서 비교해보는 과정을 거쳤다. 괄호를 붙이지 않아 우선순위 적용이 잘못 되었었다.

- 수정 전

            dp2[0][i] = dp2[0][i-1]+dp2[1][i-1]+dp2[2][i-1] % 9901;
            dp2[1][i] = dp2[0][i-1]+dp2[2][i-1] % 9901;
            dp2[2][i] = dp2[0][i-1]+dp2[1][i-1] % 9901;

- 수정 후

            dp2[0][i] = (dp2[0][i-1]+dp2[1][i-1]+dp2[2][i-1]) % 9901;
            dp2[1][i] = (dp2[0][i-1]+dp2[2][i-1]) % 9901;
            dp2[2][i] = (dp2[0][i-1]+dp2[1][i-1]) % 9901;

 

- 풀이 코드

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

public class Main {

    static int N;
    static final int MOD = 9901;
    static long dp[][];
    static long dp2[][];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        solution1(N);
        solution2(N);
        System.out.println(test2(N));
    }

    private static long test2(int N) {
        return (dp2[0][N]+dp2[1][N]+dp2[2][N])%9901;
    }

    private static long test1(int N) {
        long ans = (dp[N][0] + dp[N][1] + dp[N][2]) % MOD;
        return ans;
    }

    private static void solution1(int N) throws IOException {

        dp = new long[N + 1][3];
        dp[1][0] = dp[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;
        }

        long ans = (dp[N][0] + dp[N][1] + dp[N][2]) % MOD;
        System.out.println(ans);
    }

    public static void solution2(int N) {
        dp2 = new long[3][N+1];
        dp2[0][1] = 1;
        dp2[1][1] = 1;
        dp2[2][1] = 1;
        for (int i = 2; i <= N; i++) {
            dp2[0][i] = (dp2[0][i-1]+dp2[1][i-1]+dp2[2][i-1]) % 9901;
            dp2[1][i] = (dp2[0][i-1]+dp2[2][i-1]) % 9901;
            dp2[2][i] = (dp2[0][i-1]+dp2[1][i-1]) % 9901;
        }
        System.out.println((dp2[0][N]+dp2[1][N]+dp2[2][N])%9901);
    }
}
728x90
반응형

'알고리즘 > DP' 카테고리의 다른 글

[백준] 2775번 부녀회장이 될테야 #Java #DP  (0) 2022.05.07
[백준] 11050번 이항 계수 1 #Java  (0) 2022.05.07
[백준] 2xN 타일링  (0) 2021.11.17
[백준] 1로 만들기  (0) 2021.11.16
[알고리즘] DP 공부해보기  (0) 2021.11.10