문제 설명
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]] |
class Solution {
public int[][] solution(int[][] arr1, int[][] arr2) {
int rows1 = arr1.length;
int cols1 = arr1[0].length;
int rows2 = arr2.length;
int cols2 = arr2[0].length;
int[][] answer = new int[rows1][cols2];
for (int i = 0; i < rows1; i++) {
for (int j = 0; j < cols2; j++) {
for (int k = 0; k < cols1; k++) {
answer[i][j] += arr1[i][k] * arr2[k][j];
}
}
}
return answer;
}
}
변수 rows1, cols1, rows2, cols2를 생성합니다. 각각 arr1의 행의 길이, 열의 길이, arr2의 행의 길이, 열의 길이를 갖습니다.
배열 answer의 크기의 행은 arr1의 행의 길이, 열은 arr2의 열의 길이로 지정합니다.
첫 번째 for문이 arr1의 행의 길이만큼 순회합니다.
두 번째 for문이 arr2의 열의 길이만큼 순회합니다.
세 번째 for문이 arr1의 열의 길이만큼 순회합니다.
answer[i][j] 번째 원소에 arr1[i][k]와 arr2[k][j] 번째 원소를 곱한 값을 더하기 할당합니다.
행렬끼리 곱셈은 다음과 같은 과정을 거칩니다.
- 행렬 곱셈을 수행하기 전에 곱셈이 가능한지 확인합니다. 곱셈이 가능하려면 첫 번째 행렬의 열 수와 두 번째 행렬의 행 수가 동일해야 합니다.
- 첫 번째 행렬의 각 행과 두 번째 행렬의 각 열을 곱하여 결과 행렬의 해당 위치에 값을 누적시킵니다.
arr1 = [[1, 4], [3, 2], [4, 1]] arr2 = [[3, 3], [3, 3]] answer = [[1 * 3 + 4 * 3, 1 * 3 + 4 * 3], [3 * 3 + 2 * 3, 3 * 3 + 2 * 3], [4 * 3 + 1 * 3 + 4 * 3 + 1 * 3]] A = [[a, b], [c, d], [e, f]] B = [[g, h], [i, j]] C = [[a*g + b*i, a*h + b*j], [c*g + d*i, c*h + d*j], [e*g + f*i, e*h + f*j]] |
'프로그래머스 > Lv. 2' 카테고리의 다른 글
[프로그래머스 코딩테스트] H-Index(Java) (0) | 2023.07.02 |
---|---|
[프로그래머스 코딩테스트] 멀리 뛰기(Java) (0) | 2023.06.30 |
[프로그래머스 코딩테스트] 다음 큰 숫자(Java) (0) | 2023.06.21 |
[프로그래머스 코딩테스트] 이진 변환 반복하기(Java) (0) | 2023.06.20 |
[프로그래머스 코딩테스트] N개의 최소공배수(Java) (0) | 2023.06.19 |