문제

https://programmers.co.kr/learn/courses/30/lessons/12949


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
public int[][] solution(int[][] arr1, int[][] arr2) {
int[][] answer = new int[arr1.length][arr2[0].length];

for (int i = 0; i < arr1.length; i++) {
for(int j = 0; j < arr2[0].length; j++){
for (int k = 0; k < arr2.length; k++) {
answer[i][j] += arr1[i][k] * arr2[k][j];
}
}
}

return answer;
}

흐름

  1. 행렬의 곱은 앞 행렬의 행과 뒤 행렬의 열을 곱한 것과 같다.
    • ex) 앞 행렬이 m x n 크기이고 뒤 행렬이 n x r 크기인 경우 곱은 m x r크기의 행렬이 된다.
  2. 곱 행렬(0, 0)은 앞 행렬의 (0, 0) X 뒷 행렬 (0, 0) + 앞 행렬 (0, 1) X 뒷 행렬 (1, 0)
  3. (0, 1)은 (0, 0) X (0, 1) + (0, 1) X (1, 1)
  4. (1, 0)은 (1, 0) X (0, 0) + (1, 1) X (0, 1)
  5. (1, 1)은 (1, 0) X (0, 1) + (1, 1) X (1, 1)
  6. (2, 0)은 (2, 0) X (0, 0) + (2, 1) X (0, 1)
  7. (2, 1)은 (2, 0) X (0, 1) + (2, 1) X (1, 1)
  8. 이런식으로 진행된다.

결과

번호 속도
테스트 1 통과 (2.93ms, 54.1MB)
테스트 2 통과 (10.09ms, 54.3MB)
테스트 3 통과 (17.85ms, 56.7MB)
테스트 4 통과 (2.02ms, 50.9MB)
테스트 5 통과 (8.78ms, 53.7MB)
테스트 6 통과 (9.40ms, 56.2MB)
테스트 7 통과 (1.56ms, 52.3MB)
테스트 8 통과 (1.80ms, 50.7MB)
테스트 9 통과 (1.79ms, 50.1MB)
테스트 10 통과 (8.66ms, 54.9MB)
테스트 11 통과 (3.37ms, 52.3MB)
테스트 12 통과 (2.05ms, 54.6MB)
테스트 13 통과 (9.96ms, 54.1MB)
테스트 14 통과 (10.60ms, 54.3MB)
테스트 15 통과 (7.94ms, 54.1MB)
테스트 16 통과 (4.86ms, 54.6MB)

테스트 케이스

1
2
assertArrayEquals(new int[][] {{15, 15}, {15, 15}, {15, 15}}, test.solution(new int[][] {{1, 4}, {3, 2}, {4, 1}}, new int[][] {{3, 3}, {3, 3}}));
assertArrayEquals(new int[][] {{22, 22, 11}, {36, 28, 18}, {29, 20, 14}}, test.solution(new int[][] {{2, 3, 2}, {4, 2, 4}, {3, 1, 4}}, new int[][] {{5, 4, 3}, {2, 4, 1}, {3, 1, 1}}));

참고 사이트