Notice
Recent Posts
Recent Comments
Link
«   2026/09   »
일 월 화 수 목 금 토
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

seaking110 님의 블로그

10830번 행렬 제곱 본문

오늘의 문제

10830번 행렬 제곱

seaking110 2025. 1. 21. 13:53

문제

 

 


 

문제풀이

 

먼저 행렬의 곱 부터 알아보자!!

3 X 3 행렬의 경우 행렬의 곱은 위 사진과 같이 진행된다. 

 

즉 행렬의 제곱이라면

	public static int[][] multiplyMatrix(int[][] a, int[][] b) {
		int[][] res = 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++) {
					res[i][j] += (a[i][k] * b[k][j]) % 1000;
					res[i][j] %= 1000;
				}
			}
		}
		return multiplyMatrix(res,b);

 

이런 식으로 진행 한 뒤 그 결과와 원래 배열을 다시 메서드로 넣어 제곱 횟수만큼 반복하면 된다!

 

하지만 이 경우 4중 포문으로 어마어마한 시간이 소요된다. 따라서 정복 분할 방식을 사용하자!

 

	public static int[][] matrixPower(int[][] matrix, long exp) {
		int[][] result = new int [n][n];
		for (int i = 0; i < n; i++) {
			result[i][i] = 1;
		}

		while (exp > 0) {
			if (exp % 2 == 1) {
				result = multiplyMatrix(result, matrix);
			}
			matrix = multiplyMatrix(matrix, matrix);
			exp /= 2;
		}

		return result;
	}

 

홀수인 경우에만 단위 행렬을 통해 처리하고 짝수의 경우 거듭 제곱의 형태로 처리한다!

비록 힌트는 봤지만 분할 정복에선 행렬 문제가 참 많고 어려운 것 같다!

'오늘의 문제' 카테고리의 다른 글

2740번 행렬 곱셈  (0) 2025.01.17
1629번 곱셈  (0) 2025.01.16
1780번 종이의 개수  (0) 2025.01.15
1992번 퀴드트리  (0) 2025.01.14
14889번 : 스타트와 링크  (1) 2025.01.13