문제
https://school.programmers.co.kr/learn/courses/30/lessons/12949
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
제한 조건
- 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
- 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
- 곱할 수 있는 배열만 주어집니다.
풀이
두 행렬 A와 B를 곱하려면 다음과 같은 규칙을 따라야 한다.
A 행렬의 열 수 (열 개수)와 B 행렬의 행 수 (행 개수)가 동일해야 한다. 즉, A 행렬의 열 수가 n이고 B 행렬의 행 수가 n이라면 곱셈이 가능하다. (문제에서 곱할 수 있는 배열만 주어진다고 했으니 현재는 신경쓸 필요는 없다.)
결과 행렬의 크기는 A 행렬의 행 수와 B 행렬의 열 수로 결정된다. 따라서 결과 행렬의 크기는 (A의 행 수) × (B의 열 수)가 된다.
행렬 A와 B의 곱셈은 아래와 같이 수행된다
- A는 m × n 행렬 (m개의 행과 n개의 열로 이루어진 행렬)
- B는 n × p 행렬 (n개의 행과 p개의 열로 이루어진 행렬)
- 결과 행렬 C는 m × p 행렬
결과 행렬 C의 (i, j)번째 원소는 A의 i번째 행과 B의 j번째 열의 내적(dot product)으로 계산된다. 내적은 각 원소들끼리 곱한 뒤 그 값을 모두 더하는 것을 의미한다.
즉, C(i, j) = Σ(A(i, k) × B(k, j)) for k = 1 to n
여기서 A(i, k)는 A 행렬의 i번째 행의 k번째 원소이고, B(k, j)는 B 행렬의 k번째 행의 j번째 원소이다.
class Solution {
public int[][] solution(int[][] arr1, int[][] arr2) {
int rows1 = arr1.length;
int cols1 = arr1[0].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++) {
int sum = 0;
for (int k = 0; k < cols1; k++) {
sum += arr1[i][k] * arr2[k][j];
}
answer[i][j] = sum;
}
}
return answer;
}
}
'Programmers > Lv.2' 카테고리의 다른 글
[프로그래머스][Lv.2][Java][Heap] 더 맵게 (0) | 2023.10.12 |
---|---|
[프로그래머스][Lv.2][Java][Queue] 기능 개발 (0) | 2023.08.12 |
[프로그래머스][Lv.2][Java] n^2 배열 자르기 (0) | 2023.07.28 |
[프로그래머스][Lv.2][Java] 멀리 뛰기 (0) | 2023.05.12 |
[프로그래머스][Lv.2][Java] N개의 최소공배수 (0) | 2023.05.11 |