[알고리즘] 프로그래머스 12949

은개·2025년 2월 14일

[CS] 알고리즘

목록 보기
13/21

프로그래머스 12949 - 행렬의 곱셈

풀이

newVector[i][j] == (arr1[i][0] * arr2[0][j]) +
                                 (arr1[i][1] * arr2[1][j]) + ... +
                                 (arr1[i][n] * arr2[m][j])

  • n: arr1의 열 size
  • m: arr2의 행 size
  • newVector 크기: arr1의 행 개수 (arr1.size()) * arr2의 열 개수 (즉, arr2[0]의 size)
  • 벡터 곱셈 조건: arr1의 열 개수와 arr2의 행 개수가 같아야 함 → 즉, n == m

오답 코드

에러 발생 signal: illegal instruction (core dumped)

#include <string>
#include <vector>

using namespace std;

vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2)
    int newVector_row = arr1.size();
    int newVector_column = arr2[0].size();
    int max_k = arr1[0].size();
    
    vector<vector<int>> answer;

    for (int i = 0; i < newVector_row; i++)
    {
        for (int j = 0; j < newVector_column; j++)
        {
            for (int k = 0; k < max_k; k++)
            {
                answer[i][j] += (arr1[i][k] * arr2[k][j]);
            }
        }
    }
    
    return answer;
}
  • 원인: answer을 초기화 하지 않은 채 접근하려고 해서 segmentation fault 발생

정답 코드

#include <string>
#include <vector>

using namespace std;

vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
    int newVector_row = arr1.size();
    int newVector_column = arr2[0].size();
    int max_k = arr1[0].size();
    
    vector<vector<int>> answer(newVector_row, (vector<int>(newVector_column, 0)));

    for (int i = 0; i < newVector_row; i++)
    {
        for (int j = 0; j < newVector_column; j++)
        {
            for (int k = 0; k < max_k; k++)
            {
                answer[i][j] += (arr1[i][k] * arr2[k][j]);
            }
        }
    }
    
    return answer;
}
  • 해결: answer를 arr1의 열 size * arr2의 행 size만큼 0으로 초기화

교재 코드

행렬 곱을 할 수 있는 두 행렬의 조건

A 행렬의 크기가 (M * K), B 행려의 크기가 (K * N)일 때, 두 행렬의 곱 연산은 행렬 A의 행 개수(K)와 행렬 B의 열 개수(K)가 같아야 하며 K를 기준으로 곱하기 때문에 행렬 곱 결과는 M * N이 된다.

vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) 
{
    // 1. 최종 행렬 곱의 결과를 저장할 벡터 선언
    vector<vector<int>> answer;

    // 2. arr1과 arr2의 행렬 곱을 수행했을 때 최종 행렬의 크기만큼 공간을 할당
    answer.assign(arr1.size(), (vector<int>(arr2[1].size(), 0)));

    // 3. arr1의 각 행과 arr2의 각 열에 대해 반복문 수행    
    for (int i = 0; i < arr1.size(); i++)
        for (int j = 0; j < arr2[1].size(); j++)
            for (int k = 0; k < arr2.size(); k++)
                answer[i][j] += (arr1[i][k] * arr2[k][j]); // 4. 두 행렬의 곱을 수행
    
    return answer;
}

💡

vector.assign() 함수를 통해서도 공간 할당 가능

assign() 사용법

기본 문법

void assign(size_type count, const T& value);
  • count: 벡터의 새로운 크기 (이 크기만큼 값이 채워짐
  • value: 벡터를 채울 값

0개의 댓글