본문 바로가기
Programmers/C++

[C++] 프로그래머스 :: 행렬의 곱셈

by Sin_ 2021. 10. 15.
728x90

안녕하세요 뚜디 입니다:)

코딩테스트 연습 - 행렬의 곱셈 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 행렬의 곱셈

[[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]]

programmers.co.kr

< 프로그래머스 - 행렬의 곱셈 (lv2) >


1. 연습 문제

2. 문제 풀이

3. 소스 코드

4. 결과


1. 연습 문제
  • 문제 설명
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]]

 

2. 문제 풀이
행렬의 곱셈 부터 알아보고 가도록 하겠습니다
1. (AxB) x (CxD) 행렬의 곱셈은 (AxD) 행렬이되며 B=C가 같아야한다. (A,B,C,D는 행과 열)
2. C[0][0] = A[0][i]*B[i][0]+A[0][i+1]*B[i+1][0]+...+A[0][i+n]*B[i+n][0] 이다. (A,B,C는 행렬)

따라서, 문제 풀이는
1. 제한 조건에서 반드시 곱할 수 있는 배열만 주어진다는 조건을 제시하였다.
2. 벡터 arr1의 사이즈 만큼 반복문을 진행 (arr1의 열)
3. 벡터 arr2[0]의 사이즈 만큼 반복문을 진행 (arr2의 행)
 -> 이때 arr2[t]로 하게되면 안되고 반드시 arr[0]으로 명시해주어야한다.
4. 벡터 arr1[t]의 사이즈 만큼 반복문 진행 (arr1의 행, arr2의 열) 

 

3. 소스 코드
#include <string>
#include <vector>
#include <iostream>

using namespace std;

vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
    vector<vector<int>> answer;
    vector<int> vtemp;
    int sum = 0;

    for (int t = 0; t < arr1.size(); t++) {
        for (int i = 0; i < arr2[0].size(); i++) {
            for (int j = 0; j < arr1[t].size(); j++) {
                sum += arr1[t][j] * arr2[j][i];
            }
            vtemp.push_back(sum);
            sum = 0;
        }
        answer.push_back(vtemp);
        vtemp.clear();
    }

    return answer;
}

 

4. 결과

728x90