[백준] PS/Java [실랜디]
[백준 2780] 비밀번호 - JAVA
SH3542
2025. 5. 1. 22:02
https://www.acmicpc.net/problem/2780
dp + 노가다
좀 더 귀찮아지지만, list 순회보다 dp점화식에 바로 적용하는 것이 더 빠르다.
n = 0~9일 때,
dp[i][n] = SUM(dp[i-1][n에 인접한 수])
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
class Main {
public static void main(String[] args) throws IOException {
List<Integer>[] l = new ArrayList[10];
for (int i = 0; i < 10; i++) {
l[i] = new ArrayList<>();
}
l[0].add(7);
l[1].add(2);
l[1].add(4);
l[2].add(1);
l[2].add(3);
l[2].add(5);
l[3].add(2);
l[3].add(6);
l[4].add(1);
l[4].add(5);
l[4].add(7);
l[5].add(2);
l[5].add(4);
l[5].add(6);
l[5].add(8);
l[6].add(3);
l[6].add(5);
l[6].add(9);
l[7].add(0);
l[7].add(4);
l[7].add(8);
l[8].add(5);
l[8].add(7);
l[8].add(9);
l[9].add(6);
l[9].add(8);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
int MOD = 1234567;
int[][] dp = new int[1000][10];
for (int i = 0; i < 10; i++) {
dp[0][i] = 1;
}
for (int i = 1; i < 1000; i++) {
for (int j = 0; j < 10; j++) {
List<Integer> near = l[j];
for (int k = 0; k < near.size(); k++) {
dp[i][j] += dp[i - 1][near.get(k)];
dp[i][j] %= MOD;
}
}
}
while (T-- > 0) {
int N = Integer.parseInt(br.readLine());
int ans = 0;
for (int i = 0; i < 10; i++) {
ans += dp[N - 1][i];
ans %= MOD;
}
System.out.println(ans);
}
}
}