๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

๋ฐฑ์ค€ 10830๋ฒˆ : ํ–‰๋ ฌ ์ œ๊ณฑ | JAVA

by Yunny52 2023. 3. 14.

 

๐Ÿ“Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ

์ด ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํžˆ ํ•˜๋‚˜์˜ ํ–‰๋ ฌ์„ ๊ณ„์†ํ•ด์„œ ๊ณฑํ•ด๋‚˜๊ฐ€๋Š” ๋ฌธ์ œ์ด์ง€๋งŒ, ๊ทธ๋ ‡๋‹ค๊ณ  ํ–‰๋ ฌ์„ ๊ณฑํ•˜๋Š” ์—ฐ์‚ฐ๋งŒ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด,, ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๊ฑฐ๋“ญ์ œ๊ณฑ์˜ ์ง€์ˆ˜๋ฅผ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„์–ด๊ฐ€๋ฉฐ ๋ถ„ํ• ์ •๋ณต(dp)ํ•ด์•ผ ํšจ์œจ์ ์œผ๋กœ ์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ง€์ˆ˜๋ฅผ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ํ˜•์‹์˜ ๋ถ„ํ• ์ •๋ณต ํ’€์ด๋ฒ•์€ ์•ž์„  ๋ฌธ์ œ '๋ฐฑ์ค€ 11401๋ฒˆ ์ดํ•ญ๊ณ„์ˆ˜ 3'์—์„œ ๊ตฌํ˜„ํ•œ ์ ์ด ์žˆ๊ธฐ์— ๋”์šฑ ์‰ฝ๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 


๐Ÿ“Œ ํ’€์ด

์ „์ฒด์ ์ธ ๊ตฌํ˜„ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

main()

1. ํ–‰๋ ฌ์˜ ํฌ๊ธฐ N๊ณผ ์ง€์ˆ˜ ๊ฐ’ B ์ž…๋ ฅ๋ฐ›๊ธฐ

   - (์ฃผ์˜) ๋ฌธ์ œ์—์„œ B ๊ฐ’์˜ ๋ฒ”์œ„๊ฐ€ 1 ≤ B ≤ 100,000,000,000 ์ด๋ฏ€๋กœ, B์˜ ํƒ€์ž…์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

   - B์˜ ํƒ€์ž…์„ long์œผ๋กœ ํ•˜์ž.

2. 2์ฐจ์›์˜ ํ–‰๋ ฌ ์ž…๋ ฅ๋ฐ›๊ธฐ

   - pow ํ•จ์ˆ˜์—์„œ ์ง€์ˆ˜๊ฐ€ 1์ธ ๊ฒฝ์šฐ ํ–‰๋ ฌ์„ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๋„๋ก ํ–ˆ๋Š”๋ฐ, ๋ฌธ์ œ์˜ ์กฐ๊ฑด ์ค‘ ๊ฐ ์›์†Œ๋ฅผ 1000์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ–‰๋ ฌ์„ ์ž…๋ ฅ ๋ฐ›์„ ๋•Œ๋ถ€ํ„ฐ 1000์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€ ๊ฐ’์„ ์ž…๋ ฅํ•˜๋„๋ก ํ•˜์ž. (์ด๋Š” ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์˜ ๊ทœ์น™์— ์˜ํ•ด ๊ฐ€๋Šฅํ•˜๋‹ค.)

3. ๊ฒฐ๊ณผ ํ–‰๋ ฌ ์ถœ๋ ฅํ•˜๊ธฐ

 

pow(ํ–‰๋ ฌ, ์ง€์ˆ˜)

1. ์ง€์ˆ˜๊ฐ€ 1์ผ ๊ฒฝ์šฐ ์ž…๋ ฅ๋ฐ›์€ ํ–‰๋ ฌ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๊ธฐ

2. ์ง€์ˆ˜๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์žฌ๊ท€ํ˜ธ์ถœํ•˜๊ธฐ

3. ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋‰œ ํ–‰๋ ฌ์„ multiple() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ œ๊ณฑํ•˜๊ธฐ

4. ์ง€์ˆ˜๊ฐ€ ํ™€์ˆ˜์ผ ๊ฒฝ์šฐ ์›๋ž˜ ํ–‰๋ ฌ ํ•œ๋ฒˆ ๋” ๊ณฑํ•ด์ฃผ๊ธฐ

 

multiple(ํ–‰๋ ฌ1, ํ–‰๋ ฌ2)

1. ํ–‰๋ ฌ ๊ณฑ์…ˆ ๊ตฌํ˜„ํ•˜๊ธฐ

 


๐Ÿ“Œ ์ฝ”๋“œ

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

public class Main {

    static int N;
    static int P = 1000;
    static int[][] map;

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        N = Integer.parseInt(st.nextToken());
        long B = Long.parseLong(st.nextToken());  // ํƒ€์ž… ์ฃผ์˜

        map = new int[N][N];

        // ํ–‰๋ ฌ ์ž…๋ ฅ
        for(int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            for(int j = 0; j < N; j++) {
                map[i][j] = Integer.parseInt(st.nextToken()) % P;
            }
        }

        // ํ–‰๋ ฌ ๊ฑฐ๋“ญ์ œ๊ณฑ
        int[][] result = pow(map, B);

        // ๊ฒฐ๊ณผ ์ถœ๋ ฅ
        StringBuilder sb = new StringBuilder();

        for(int i = 0; i < N; i++) {
            for(int j = 0; j < N; j++) {
                sb.append(result[i][j]).append(' ');
            }
            sb.append('\n');
        }

        System.out.println(sb);

    }

    public static int[][] pow(int[][] base, long expo) {

        //์ง€์ˆ˜๊ฐ€ 1์ผ ๊ฒฝ์šฐ
        if(expo == 1L)
            return base;

        // ์ง€์ˆ˜๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์žฌ๊ท€ํ˜ธ์ถœ
        int[][] ret = pow(base, expo/2);

        // ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋‰œ ํ–‰๋ ฌ์„ ์ œ๊ณฑ
        ret = multiply(ret, ret);

        // ์ง€์ˆ˜๊ฐ€ ํ™€์ˆ˜๋ผ๋ฉด
        // base^(expo/2) * base^(expo/2) * base ์ด๋‹ค.
        if(expo % 2 == 1L)
            ret = multiply(ret, base);

        return ret;

    }

    public static int[][] multiply(int[][] o1, int[][] o2) {

        int[][] ret = new int[N][N];

        for(int i = 0; i < N; i++) {
            for(int j = 0; j < N; j++) {
                for(int k = 0; k < N; k++) {
                    ret[i][j] += o1[i][k] * o2[k][j];
                    ret[i][j] %= P;
                }
            }
        }

        return ret;
    }

}

 

๋Œ“๊ธ€