[PS/JAVA] (배열/수학) 프로그래머스_12949_행렬의 곱셈
2023. 7. 28. 07:47
반응형
문제
https://school.programmers.co.kr/learn/courses/30/lessons/12949
더보기
문제 설명
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]] |
[[5, 4, 3], [2, 4, 1], [3, 1, 1]] | [[5, 4, 3], [2, 4, 1], [3, 1, 1]] | [[22, 22, 11], [36, 28, 18], [29, 20, 14]] |
문제에서 인사이트 도출
1. 문제 파악
말 그대로 행렬의 곱셈을 구현하는 문제. 문제파악에 별다른 어려움은 없다.
곱할 수 있는 형태로만 주어지게 되어, 따로 검사를 할 필요도 없다.
2. 입력 파악
2개의 2차원 배열 arr1, arr2.
출력은 행렬 곱의 결과의 2차원 배열이 되어야 할 텐데, 출력의 차원은 아래와 같다.
3x2 X 2x4 = 3x4 = result[arr1 행의 크기][arr2 열의 길이]
문제풀이
1. 출력으로 나올 차원에 맞추어 순회
class Solution {
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++){ //결과 열
}
// answer[i][j] = ?
}
return answer;
}
}
출력으로 [결과 행]은 arr1의 행의 길이, [결과 열]은 arr2의 열의 길이에 해당하므로 출력 차원을 우선으로 생각하면 반복문을 구성하기가 수월하다.
2. 행렬 연산
class Solution {
public int[][] solution(int[][] arr1, int[][] arr2) {
int[][] answer = new int[arr1.length][arr2[0].length];
for(int i = 0; i < arr1.length; i++){ // 결과 행 = arr1 행 순회(아래쪽 방향)
for(int j = 0; j < arr2[0].length; j++){ //결과 열 = arr2 열 순회(오른쪽 방향)
int sum = 0;
for(int k = 0; k < arr2.length; k++){ //arr2 행 순회(아래쪽 방향)
sum += arr1[i][k] * arr2[k][j];
}
answer[i][j] = sum;
}
}
return answer;
}
}
arr1의 하나의 행은, arr2의 하나의 열에 대한 모든 행에 대해서 곱셈의 합의 연산이 이루어져야 한다.
따라서 arr2의 행을 순회하는 반복문을 추가하여, 위의 계산과정을 행한다.
계산 결과는 answer[i][j]에 담아둔다.
최종 소스코드
class Solution {
public int[][] solution(int[][] arr1, int[][] arr2) {
int[][] answer = new int[arr1.length][arr2[0].length];
for(int i = 0; i < arr1.length; i++){ // 결과 행 = arr1 행 순회(아래쪽 방향)
for(int j = 0; j < arr2[0].length; j++){ //결과 열 = arr2 열 순회(오른쪽 방향)
int sum = 0;
for(int k = 0; k < arr2.length; k++){ //arr2 행 순회(아래쪽 방향)
sum += arr1[i][k] * arr2[k][j];
}
answer[i][j] = sum;
}
}
return answer;
}
}
반응형
'PS > 문제풀기' 카테고리의 다른 글
[PS/JAVA] (배열/수학) 프로그래머스_81302_거리두기 확인하기 (0) | 2023.07.28 |
---|---|
[PS/JAVA] (배열/수학) 프로그래머스_68645_삼각 달팽이 (0) | 2023.07.15 |
[PS/JAVA] (배열/수학) 프로그래머스_87377_교점에 별 만들기 (2) | 2023.07.09 |