문제 설명
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
제한 조건- 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
- 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
- 곱할 수 있는 배열만 주어집니다.
arr1 arr2 return
[[1, 4], [3, 2], [4, 1]] | [[3, 3], [3, 3]] | [[15, 15], [15, 15], [15, 15]] |
[[2, 3, 2], [4, 2, 4], [3, 1, 4]] | [[5, 4, 3], [2, 4, 1], [3, 1, 1]] | [[22, 22, 11], [36, 28, 18], [29, 20, 14]] |
행렬의 곱셈은 배열의 곱셈과 다르게 조건이 있다
문제의 예시를 보며 정리하도록 하자
arr1 열(column)의 개수(2)와 arr2의 행(row)의 개수(2)가 같을 때 곱셈이 가능하다
두 개를 곱한 행렬을 arr3라 했을 때,
(1,1)의 성분은 arr1의 1행 성분과 arr2의 1열 성분을 다 곱해서 더한 값이 된다.
1 | 4 |
3 | 2 |
4 | 1 |
3 | 3 |
3 | 3 |
arr1 1열 성분은 1,4
arr2의 행의 성분은 3, 3
1*3 + 4*3 식으로 정해지게 된다
본 알고리즘을 기반으로 작성한 나의 코드)
class Solution {
public int[][] solution(int[][] arr1, int[][] arr2) {
int row = arr1.length;
int col = arr2[0].length;
int arr2col = arr2.length;
int[][] answer = new int[row][col];
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
for(int a=0; a<arr2col; a++){
answer[i][j] = answer[i][j] + arr1[i][a]*arr2[a][j];
}
}
}
return answer;
}
}
// arr1 arr2
// 1 4 3 3
// 3 2 3 3
// 4 1
// int ROW = arr1.length; // m1의 행 길이 > 3
// int COL = arr2[0].length; // m2의 열 길이 > 2
// int M2_ROW = m2.length; // m2의 행 길이 > 2
// int[][] m3 = new int[ROW][COL];
// for(int i = 0 ; i < ROW ; i++) {
// for(int j = 0 ; j < COL ; j++) {
// for(int k = 0 ; k < M2_ROW ; k++) {
// m3[i][j] += m1[i][k] * m2[k][j];
// [0][0] = 1*3 + 4*3 > 15
// [0][1] = 1*3 + 4*3 > 15
// }
// }
// }
자주 사용할 것 같은 알고리즘이니 기억하도록 하자
'코딩테스트 연습(with java) > 프로그래머스' 카테고리의 다른 글
프로그래머스<구명보트> (0) | 2022.09.18 |
---|---|
프로그래머스<카펫> (0) | 2022.09.17 |
프로그래머스<가장 큰 수>-2차(2022.09.15수정)-3차(2022.09.16풀이 참고 후 code review) (0) | 2022.09.14 |
프로그래머스<기능개발>-수정요구 (0) | 2022.09.13 |
프로그래머스<올바른 괄호>-2차-3차(수정완료22.09.16) (0) | 2022.09.12 |