문제 링크
난이도 : Lv. 2
문제 내용
문제 설명
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]]
문제 분석
행렬의 곱은 앞 행렬 a, 뒤 행렬 b가 있을 때
a의 1행 1열 * b의 1행 1열 + a의 1행 2열 * b의 2행 1열 … ⇒ 행렬곱 결과의 1행 1열
a의 1행 1열 * b의 1행 2열 + a의 1행 2열 * b의 2행 2열 … ⇒ 행렬곱 결과의 1행 2열
a의 2행 1열 * b의 1행 1열 + a의 2행 2열 * b의 2행 1열 … ⇒ 행렬곱 결과의 2행 1열
이거 참고해서 만듬
작성한 코드
// 250406
#include <string>
#include <vector>
using namespace std;
int matToInt(vector<vector<int>>& arr1, vector<vector<int>>& arr2, int row, int col) {
// 해당 행과 열에 나와야 하는 값 (곱해서)
int answer = 0;
int next = 0;
while(next < arr1[0].size()){
answer += arr1[row][next] * arr2[next][col];
next++;
}
return answer;
}
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
vector<vector<int>> answer(arr1.size(), vector<int>(arr2[0].size(), 0));
for(int i = 0; i < answer.size(); i++)
for(int j = 0; j < answer[0].size(); j++)
answer[i][j] = matToInt(arr1, arr2, i, j);
return answer;
}
우수 코드 분석
// 프로그래머스 책 내용
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
vector<vector<int>> answer;
answer.assign(arr1.size(), vector<int>(arr2[0].size(), 0));
for(int i = 0; i < arr1.size(); i++) {
for(int j = 0; j < arr2[0].size(); j++) {
for(int k = 0; j < arr2.size(); k++) {
answer[i][j] += arr1[i][k] * arr2[k][j];
}
}
}
}
내가 함수로 따로 뺀 부분을 안에 넣을 수 있었음
첫 번째 for문은 arr1의 행을 순환
두 번째 for문은 arr2의 열을 순환
세 번째 for문은 연산할 때 arr2의 고정된 열을 행마다 돌아야 해서 생성
시간복잡도는 O(n^3) (크기도 해라..)