문제풀이/프로그래머스
[JAVA , Lv.2] 행렬의 곱셈
PhoB
2023. 2. 8. 21:55
[문제]
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
[제한사항]
- 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
- 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
- 곱할 수 있는 배열만 주어집니다.
[내 풀이]
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 k = 0; k<arr2[0].length; k++){
for(int t = 0; t<arr1[0].length; t++){
answer[i][k] += arr1[i][t] * arr2[t][k];
}
}
}
return answer;
}
}
[접근]
행렬의 곱 식을 구현하기만 하면 되는 문제이다.
answer[i][k] += arr1[i][t] * arr2[t][k]; 이부분과 for문들의 루프 횟수 조절을 잘 해주어야 할 것이다.
[오류 원인 및 해결]
처음 문제를 풀때는 정답 코드와는 조금 다른, for문의 루프 횟수를 solution에 들어온 파라미터가 아닌 answer의 크기로 설정해서 했더니 테스트 케이스는 정답이었지만 제출로 돌려보니 실패하는 케이스도 있고 런타임 에러가 나는 케이스도 있었다.
class Solution {
public int[][] solution(int[][] arr1, int[][] arr2) {
int[][] answer = new int[arr1.length][arr2[0].length]; //매트릭스 크기 설정
for(int i=0; i<answer.length; i++){
for(int k = 0; k<answer[0].length; k++){
for(int t = 0; t<answer[0].length; t++){
answer[i][k] += arr1[i][t] * arr2[t][k];
}
}
}
return answer;
}
}
그래서 이것저것 바꾸어가며 제출을 해본결과, 가장 안쪽 루프에서 문제가 있었다.
가장 안쪽 루프를 answer[0].length가 아닌 arr1[0].length로 하였더니 정답처리되었다.