◇ 문제 설명
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[][] answer = {};
return answer;
}
}
◇ 참고 사항
첫번째, 2차원 배열
- 1차원 배열이 2개인 것으로 1차원 배열에서는 단순히 직선의 형태였다면 2차원 배열을 행과 열을 가지는 면으로 이루어진다.
- 흔히 2차원 배열의 행을 i, 열을 j로 표기한다.
- 2차원 배열의 인덱스 -> [i][j]
[0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] - 2차원 배열의 크기
- 2차원 배열의 행 크기 : arr.length
- 2차원 배열의 열 크기 : arr[0].length
두번째, 행렬의 곱셈 방법
- 정의 : 행렬 A의 열의 개수와 행렬 B의 행의 개수가 같을 때, A의 i행과 B의 j열의 대응하는 위치에 있는 성분을 차례로 곱하여 더한 것을 (i, j) 성분으로 하는 행렬을 A와 B의 곱이라 한다.
https://terms.naver.com/entry.naver?docId=2073781&cid=47324&categoryId=47324 - 두 행렬의 곱셈방법 예시
a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
결과b[0][0] b[0][1] b[1][0] b[1][1]
오른쪽(→)으로 이동시 b의 열 인덱스가 1씩 증가result[0][0] =
a[0][0] * b[0][0]
+ a[0][1] * b[1][0]result[0][1] =
a[0][0] * b[0][1]
+ a[0][1] * b[1][1]result[1][0] =
a[1][0] * b[0][0]
+ a[1][1] * b[1][0]result[1][1] =
a[1][0] * b[0][1]
+ a[1][1] * b[1][1]result[2][0] =
a[2][0] * b[0][0]
+ a[2][1] * b[1][0]result[2][1] =
a[2][0] * b[0][1]
+ a[2][1] * b[1][1]
아래(↓)로 이동시 a의 행 인덱스 1씩 증가
각 요소 안에서 a의 열 및 b의 행 인덱스 1씩 증가
※ 참고 : 행렬의 곱셈에서 a의 열 인덱스 크기와 b의 행 인덱스 크기는 같다.(다르면 행렬의 곱셈이 정의되지 않음)
행렬의 곱셈
[ 1. 교과서 속 주개념] [ 1) 행렬의 곱셈정의] 행렬 A의 열의 개수와 행렬 B의 행의 개수가 같을 때, A의 i행과 B의 j열의 대응하는 위치에 있는 성분을 차례로 곱하여 더한 것을 (i, j) 성분으로 하는
terms.naver.com
◇ 답안
더보기
더보기
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 l = 0; l<arr2[0].length; l++){
int temp = 0;
//첫번째 배열의 열크기, 두번째 배열의 행크기는 같으며, 이를 반복
for(int j = 0; j<arr1[0].length; j++){
//arr1[i][j] * arr2[j][l]의 값을 temp에 더하며 저장(누적합)
temp += arr1[i][j]*arr2[j][l];
}
//answer[i][l]에 temp 값 저장
answer[i][l] = temp;
}
}
return answer;
}
}
◇ 실행결과

◇ 출처
https://programmers.co.kr/learn/challenges
코딩테스트 연습
기초부터 차근차근, 직접 코드를 작성해 보세요.
programmers.co.kr
'코딩테스트 > Java' 카테고리의 다른 글
| [Level2] 최댓값과 최솟값 답안 및 풀이 (0) | 2021.12.25 |
|---|---|
| [Level2] 최솟값 만들기 답안 및 풀이 (0) | 2021.12.24 |
| [Level2] 피보나치 수 답안 및 풀이 (0) | 2021.12.22 |
| [Level2] JadenCase 문자열 만들기 답안 및 풀이 (0) | 2021.12.21 |
| [Level2] N개의 최소 공배수 답안 및 풀이 (0) | 2021.12.20 |
댓글