개념
행렬은 값을 행과 열로 배치한 것입니다. R×K 행렬과 K×C 행렬을 곱하면 R×C 행렬을 얻습니다. 앞 행렬의 열 수와 뒤 행렬의 행 수가 같아야 합니다.
행렬 곱셈
결과의 한 원소는 앞 행렬의 행과 뒤 행렬의 열에서 같은 위치의 값을 곱해 더합니다.
Cij=∑k=0K−1AikBkj.
일반적으로 AB와 BA는 다르므로 곱하는 순서를 지켜야 합니다. 행렬 곱셈에는 결합법칙이 성립하므로 (AB)C=A(BC)입니다.
예를 들어 다음 두 행렬의 곱에서 첫 행·첫 열의 값은 1×5+2×7=19입니다. 첫 행·둘째 열의 값은 1×6+2×8=22입니다.
(1324)(5768)=(19432250).
결과 행렬의 원소 하나를 구할 때 앞 행렬의 한 행과 뒤 행렬의 한 열에서 같은 개수의 원소를 짝지어야 하므로, 앞의 열 수와 뒤의 행 수가 같아야 합니다.
행렬 거듭제곱
정사각행렬 A를 반복해서 곱한 AB도 지수를 절반으로 나누어 계산합니다. A2k=AkAk, A2k+1=AkAkA입니다.
지수 0의 결과는 항등행렬입니다. 항등행렬은 대각 원소가 1, 나머지가 0이며 AI=IA=A를 만족합니다.
같은 규칙을 여러 단계 적용하는 계산을 행렬로 표현할 수 있으면 행렬 거듭제곱을 사용할 수 있습니다. 예를 들어 두 수 (x,y)를 한 단계마다 (x+y,x)로 바꾸는 규칙은 다음과 같습니다.
(1110)(xy)=(x+yx).
(1,0)에서 시작하면 (1,1)→(2,1)→(3,2)가 됩니다. 같은 행렬을 세 번 곱하면 세 단계의 결과를 얻으므로, B단계의 결과는 행렬의 B제곱으로 계산합니다. 결합법칙에 따라 곱셈을 묶을 수 있어 지수를 절반으로 줄여 구한 행렬을 제곱하는 방법이 성립합니다. 상태의 개수에 해당하는 행렬 크기는 작고, 반복 단계 수는 큰 문제에 적합합니다.
복잡도
정사각행렬의 한 변 크기를 N, 지수를 B라고 합니다.
| 연산 | 시간복잡도 | 공간복잡도 |
|---|
| 행렬 곱셈 | O(N3) | 결과 행렬 O(N2) |
| 재귀 빠른 거듭제곱 | O(N3log(B+1)) | 중간 행렬·재귀 O(N2log(B+1)) |
예제
문제
정사각행렬의 B제곱을 구하여라.
입력
첫째 줄에 행렬의 크기 N과 지수 B가 공백을 사이에 두고 주어진다. 1≤N≤3; 0≤B≤8이다.
다음 N개 줄에 행렬의 각 행을 이루는 정수 N개가 공백을 사이에 두고 주어진다. 각 원소는 0 이상 2 이하이다.
출력
결과 행렬을 N개 줄에 출력한다. 같은 행의 값은 공백으로 구분한다.