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
'Programmers > C++' 카테고리의 다른 글
[C++] 프로그래머스 :: 최솟값 만들기 (0) | 2021.10.16 |
---|---|
[C++] 프로그래머스 :: 피보나치 수 (0) | 2021.10.15 |
[C++] 프로그래머스 :: JadenCase 문자열 만들기 (0) | 2021.10.14 |
[C++] 프로그래머스 :: N개의 최소공배수 (0) | 2021.10.14 |
[C++] 프로그래머스 :: 없는 숫자 더하기 (0) | 2021.10.07 |