๋ฐฑ์ค - 1533 ๊ธธ์ ๊ฐ์ JAVA
- -
๐ฒ๋ฌธ์
์ฃผ์: ๋ฐฑ์ค 1533
์ธ์ค์ด๋ ์ ๋ฌธ์ด๋ฅผ ๋ฐ๋ฆฌ๋ฌ ๊ณตํญ์ผ๋ก ๊ฐ๊ธฐ๋ก ํ๋ค. ํ์ง๋ง, ๋ฐฉ๊ธ ์ธ์ค์ด๋ ์ ๋ฌธ์ด์ ๋นํ๊ธฐ๊ฐ ์ฐ์ฐฉ๋๋ค๋ ์ ํ๋ฅผ ๋ฐ์๋ค. ์ธ์ค์ด๋ ์ ๋ฌธ์ด๊ฐ ์ ํํ๊ฒ ๋ช ๋ถ ๋ฆ๋์ง ์๊ณ ์๊ณ , ๊ทธ ์๊ฐ ๋์ ๋ฐ์์ ๋๋ผ์ด๋ธ๋ฅผ ํ๋ ค๊ณ ํ๋ค. ์ ๋ฌธ์ด๊ฐ ๋ฆ๋ ์๊ฐ์ T๋ผ๊ณ ํ์.
์ธ์ค์ด๋ ์๊ธฐ๊ฐ ์ง๊ธ ์๋ ์์น์์๋ถํฐ, ๊ณตํญ๊น์ง ์ ํํ๊ฒ T๋ถ๋ง์ ๋์ฐฉํ๋ ๊ฒฝ๋ก์ ๊ฐ์๋ฅผ ๊ตฌํ๊ณ ์ถ๋ค.
๊ธธ์ ์ ๋ณด๋ ์ธ์ ํ๋ ฌ๋ก ์ฃผ์ด์ง๋ค. A[i][j]๊ฐ 0์ด๋ผ๋ฉด i์์ j๋ก ๊ฐ๋ ๊ธธ์ด ์๋ ๊ฒ์ด๊ณ , A[i][j] ≤ 5๋ผ๋ฉด, ์ ํํ ๊ทธ ๋งํผ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ i์์ j๋ก ๊ฐ๋ ๊ธธ์ด ์๋ ๊ฒ์ด๋ค.
๐ฒ์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ต์ฐจ์ ์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. N์ 10๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๊ณ , ์์์ ์ ์์น S์ ๋์ ์ ์์น E, ๊ทธ๋ฆฌ๊ณ ์ ๋ฌธ์ด๊ฐ ๋ฆ๋ ์๊ฐ T๋ ์ฃผ์ด์ง๋ค. S์ E๋ N๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. T๋ 1,000,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ๋์งธ ์ค๋ถํฐ ๊ธธ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค.
๐งํ์ด
ํ์ด๋ฐฉ๋ฒ
T์ ์ซ์๊ฐ ๋๋ฌด ํฌ๊ธฐ ๋๋ฌธ์ O(V^2*T)์ DP๋ก ํ์ผ๋ ค๊ณ ํ๋ค๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ๋ ๊ฒ์ด๋ค. ๋ง์ฝ ๊ฐ์ค์น๊ฐ 1์ธ ๊ทธ๋ํ๋ผ๋ฉด ์ธ์ ํ๋ ฌ ๊ทธ๋ํ ๋ฐฉ์์ผ๋ก ํ ์ ์๋ค. ๊ฐ์ค์น๊ฐ 1์ธ ์ธ์ ํ๋ ฌ ๊ทธ๋ํ๋ฅผ n๋ฒ ์ ๊ณฑํ๋ฉด S์์ E๋ก ๊ฐ๋ ๊ฒฝ๋ก์ค n๊ฐ์ ๊ฐ์ ์ด ์๋ ๊ฒฝ๋ก์ ์์ ๊ฐ๊ธฐ ๋๋ฌธ์ด๊ณ , O(V^3 * logT)์ ์ฐ์ฐ์ด๋ผ T์ ์๋ฅผ ํ์ ํ ์ค์ผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ํด๋น ๋ฌธ์ ์์๋ ๊ฐ์ค์น๊ฐ 5์ดํ์ด๋ค.
์ด๋ N์ ๊ฐ์๊ฐ ์ ๊ธฐ ๋๋ฌธ์ ํ๋์ ์ ์ ์ 5๊ฐ๋ก ๋ถํ ํ์ฌ ๊ณ์ฐํ์ฌ๋ ๊ณ์ฐ ์ ํฐ ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ด๋ค.
์ด ๋, N5 x N5์ ๋งคํธ๋ฆญ์ค๊ฐ ๋ง๋ค์ด์งํ ๋ฐ ์๋ ์ ์ ์ด ์๋ ๋ถํ ๋ ์ ์ ๋ค์ ์์ ๋ณด๋ค 1์ด ํฐ ์ ์ ์ผ๋ก ๊ฐ์ค์น๊ฐ 1๋ก ์ฃผ์ด์ง๋ฏ๋ก, (i * 5 - ๊ฐ์ค์น)๋ก ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฐ๋ค๋ฉด ์ ์ฒด ํ๋ ฌ์ ๊ฐ์ค์น๊ฐ 1์ธ ํ๋ ฌ๋ก ๋ง๋ค ์ ์๋ค.
์ดํ ํ๋ ฌ์ ๊ณฑ์ ๊ตฌํํ์ฌ ๊ณฑํด์ฃผ๋ฉด ๋๋ค.
1. N๊ณผ S, E, T๋ฅผ ์ ๋ ฅ๋ฐ๊ณ ๊ฐ์ ์ ๋ ฅ๋ฐ์ ๋ฐฐ์ด(N*5์ฌ์ด์ฆ)์ ์์ฑํ๋ค.
2. ๋ค์์ค์ string ๊ฐ์ ์ ๋ ฅ๋ฐ๊ณ ์ฌ์ด์ฆ๋งํผ ํ๋์ฉ ์ซ์๋ฅผ ์๋ผ ํด๋น ์ซ์๊ฐ 0์ด ๋๋์ง ์ฒดํฌํ๊ณ 0์ด ๋๋๋ค๋ฉด [i*5][(j + 1) * 5 - ๊ฐ์ค์น -1] ์ ๊ฐ์ค์น๋ฅผ ๋๋ค.
3. ๋ถํ ๋ ์ ์ ๋ค์ ์์ ๋ณด๋ค 1 ํฐ ์๋ก ํฅํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ค์น๋ฅผ ๋๋ค.
import java.util.Scanner;
public class Main{
static Scanner sc = new Scanner(System.in);
static long[][] array;
static long[][] ans;
static int N, S, E, T;
static final int MOD = 1000003;
public static void main(String[] args) {
N = sc.nextInt();
S = sc.nextInt();
E = sc.nextInt();
T = sc.nextInt();
array = new long[(N * 5) + 1][(N * 5) + 1];
sc.nextLine();
for(int i = 1; i <= N; i++) {
String s = sc.nextLine();
for (int j = 0; j < s.length(); j++){
if (s.charAt(j) != '0') {
array[i * 5][(j + 1) * 5 - (s.charAt(j) - '0' - 1)] = 1;
}
}
for(int j = 1; j < 5; j++)
array[(i - 1) * 5 + j][(i - 1) * 5 + j + 1] = 1;
}
System.out.println(powProcession(array,T)[5*S][5*E]);
}
4. array ๋ฐฐ์ด์ T๋งํผ ๊ณฑํ ๊ฒฐ๊ณผ ๊ฐ์ ๋ด์ result ๋ฐฐ์ด์ ์ค์ ํ๋ค.
5. T๊ฐ ํ์์ด๋ฉด result์ array๋ฅผ ๊ณฑํ๊ณ ์ง์๋ผ๋ฉด array๋ฅผ ์ ๊ณฑํ๋ค. T๋ฅผ 2๋ก ๋๋๊ณ 0์ด ๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค. ๋ง์ง๋ง์๋ ๋ฌด์กฐ๊ฑด T๊ฐ 1์ด๋ฏ๋ก result์ ์ ์ฒด ์ ๊ณฑํ ๊ฐ์ด ๋ด๊ธด๋ค.
public static long[][] powProcession(long[][] a, int n){
long[][] result = new long[N * 5 + 1][N * 5 + 1];
for(int i = 1; i <= N * 5; i++) result[i][i] = 1;
while(n != 0){
if(n % 2 == 1)
result = squareProcession(result, a);
n /= 2;
a = squareProcession(a,a);
}
return result;
}
6. ํ๋ ฌ ๋ ๊ฐ๋ฅผ ์ ๋ ฅ๋ฐ๊ณ ์๋ก ๊ณฑํด์ฃผ๋ ํจ์๋ฅผ ์์ฑํ๋ค. ๊ณฑํด์ฃผ๋ฉด์ ๊ฐ์ด ๋งค์ฐ ์ปค์ง๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก ์ด๊ธฐ์ ์ค์ ํ MOD๊ฐ์ผ๋ก ๊ณ์ ๋๋ ์ค๋ค.
public static long[][] squareProcession(long[][] a, long[][] b) {
long[][] result = new long[N * 5 + 1][N * 5 + 1];
for (int i = 1; i <= 5 * N; i++) {
for (int j = 1; j <= 5 * N; j++) {
for (int k = 1; k <= 5 * N; k++) {
result[i][j] += (a[i][k] * b[k][j]);
result[i][j] %= MOD;
}
}
}
return result;
}
๐ง ์ ์ฒด ์ฝ๋
import java.util.Scanner;
public class Main{
static Scanner sc = new Scanner(System.in);
static long[][] array;
static long[][] ans;
static int N, S, E, T;
static final int MOD = 1000003;
public static void main(String[] args) {
N = sc.nextInt();
S = sc.nextInt();
E = sc.nextInt();
T = sc.nextInt();
array = new long[(N * 5) + 1][(N * 5) + 1];
sc.nextLine();
for(int i = 1; i <= N; i++) {
String s = sc.nextLine();
for (int j = 0; j < s.length(); j++){
if (s.charAt(j) != '0') {
array[i * 5][(j + 1) * 5 - (s.charAt(j) - '0' - 1)] = 1;
}
}
for(int j = 1; j < 5; j++)
array[(i - 1) * 5 + j][(i - 1) * 5 + j + 1] = 1;
}
System.out.println(powProcession(array,T)[5*S][5*E]);
}
public static long[][] squareProcession(long[][] a, long[][] b) {
long[][] result = new long[N * 5 + 1][N * 5 + 1];
for (int i = 1; i <= 5 * N; i++) {
for (int j = 1; j <= 5 * N; j++) {
for (int k = 1; k <= 5 * N; k++) {
result[i][j] += (a[i][k] * b[k][j]);
result[i][j] %= MOD;
}
}
}
return result;
}
public static long[][] powProcession(long[][] a, int n){
long[][] result = new long[N * 5 + 1][N * 5 + 1];
for(int i = 1; i <= N * 5; i++) result[i][i] = 1;
while(n != 0){
if(n % 2 == 1)
result = squareProcession(result, a);
n /= 2;
a = squareProcession(a,a);
}
return result;
}
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค