알고리즘/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
반응형