문제 링크
난이도 : 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) (크기도 해라..)