์ƒˆ์†Œ์‹

๋ฐ˜์‘ํ˜•
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

๋ฐฑ์ค€ - 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;
    }
 
๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.