문제
행렬의 곱셈은, 곱하려는 두 행렬의 어떤 행과 열을 기준으로, 좌측의 행렬은 해당되는 행, 우측의 행렬은 해당되는 열을 순서대로 곱한 값을 더한 값이 들어갑니다. 행렬을 곱하기 위해선 좌측 행렬의 열의 개수와 우측 행렬의 행의 개수가 같아야 합니다. 곱할 수 있는 두 행렬 A,B가 주어질 때, 행렬을 곱한 값을 출력하는 productMatrix 함수를 완성해 보세요.
풀이
행렬의 곱셈에 대한 알고리즘이다. 영상 처리를 자주 하다보니 이미지를 2차원 배열로 생성하여 연산하는 것이 흔한 일상이 되었다..
그래서 사실 2차원 배열에 대한 컨트롤이 크게 어렵지는 않았다. 구현 상 딱히 설명할 부분은 없다고 생각하는데
문제에서 vector를 사용하여 아래 링크를 통해 이미지, 즉 2차원 배열에 대한 표현을 확인하자.
추가적으로 고등학교 때 배운 내용이지만 두 행렬 A, B가 있을 때
이것이 각각 P * Q 형태와 Q * R형태여야 행렬 간 곱셈이 가능하고 결과 행렬은 P * R형태가 된다.
예를 들어 5*2 행렬
과 3*6 행렬
은 서로 곱할 수 없고 5*3 행렬
과 3*6 행렬
은 곱할 수 있다. 그리고 결과물은 5*6
이 된다.
소스 코드
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int> > productMatrix(vector<vector<int> > A, vector<vector<int> > B)
{
vector<vector<int> > answer;
/* 구현 시작부 */
int sum;
int P = A.size(), Q = A[0].size(), R = B[0].size();
answer.resize(P, vector<int>(R));
for (int x = 0; x < P; x++)
{
for (int y = 0; y < R; y++)
{
sum = 0;
for (int z = 0; z < Q; z++)
{
sum += A[x][z] * B[z][y];
}
answer[x][y] = sum;
}
}
/* 구현 종료부 */
return answer;
}
int main()
{
vector<vector<int> > A{ { 1, 2 }, { 2, 3 } };
vector<vector<int> > B{ { 2, 3 }, { 3, 4 } };
vector<vector<int> > testAnswer = productMatrix(A, B);
for (int i = 0; i < testAnswer.size(); i++)
{
for (int j = 0; j < testAnswer[i].size(); j++)
cout << testAnswer[i][j] << " ";
cout << "\n";
}
}
알고리즘 문제 Level 2 | 프로그래머스
'Algorithm' 카테고리의 다른 글
엔터까지 N개의 숫자 입력 받기 - C++ (0) | 2018.12.27 |
---|---|
시저 암호 (0) | 2018.12.27 |
2016년 요일 구하기 (0) | 2018.12.27 |
콜라츠 추측 (0) | 2018.12.27 |
소수 찾기 - 에라토스테네스의 체 (0) | 2018.12.27 |