문제를 풀기에 앞서 우리는 Vector라는 프로그래밍에서 중요한 개념을 알고 넘어가야 한다.
Vector는 많은 양의 데이터를 다룰 때 효과적으로 메모리를 관리할 수 있게 해준다.
자동으로 메모리가 할당되는 배열
Template를 사용하기 때문에 데이터 타입이 자유롭다.
Vector의 생성자와 연산자
- vector V
: 비어있는 vector v를 생성
- vector v(5)
: 기본값인 0으로 초기화된 5개의 원소를 가지는 vector v 생성
- vector v(5,2)
: 2로 초기화된 5개의 원소를 가지는 vector v 생성
- vector v1(v2)
: v2를 복사한 v1생성
Vector의 멤버 함수
- v.assign(a, b)
: b의 값으로 a개의 원소 할당
- v.at(idx), v[idx]
: idx번째 원소를 참조
- v.front(), v.back()
: 첫 번째 원소를 참조/ 마지막 원소를 참조
- v.clear()
: 모든 원소를 제거, 원소만 제거하고 메모리는 남는다.
- v.push_back(7)
: 마지막 원소 뒤에 원소 7을 삽입한다. 자주 사용되는 함수.
- v.pop_back()
: 마지막 원소를 제거한다. 자주 사용되는 함수
위와 같은 멤버함수를 사용함으로써 Vector를 통해 효율적인 메모리 관리를 할 수 있다.
이번 문제의 핵심은 1차원 Vector가 아닌, 2차원 Vector를 다루는 것이다.
Vector Container를 원소로 가지고 있는 Vector Container
기존 1차원 vector를 사용하는 것과 비슷하다 단, 기존 1차원 vector는 원소가 단순 변수이지만, 다차원 Vector는 Vector를 원소로 사요한다는 점을 주의해야 한다.
다차원 Vector를 이용한 문제다. 기본적인 행렬의 곱을 할 줄 알아야 풀 수 있는 문제다.
arr1에서는 행을 뽑고, arr2에서는 열을 뽑아 각각의 원소를 곱하고 더하여 answer의 각각의 원소의 값을 찾는다.
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
vector<vector<int>> answer;
for(int i=0; i<arr1.size(); i++){ // arr1에서의 행 단위 추출
vector<int> v1; //다차원 Vector 삽입을 위한 1차원 Vector(answer의 각 행)
for(int j=0; j<arr2[0].size(); j++){ // arr2에서의 열 단위 추출(열의 개수를 위한 arr2[0]사용)
int val=0;
for(int k=0; k<arr2.size(); k++){ //arr1과 arr2의 각 행과 열의 곱과 합
val+=(arr1[i][k]*arr2[k][j]);
}
v1.push_back(val);
}
answer.push_back(v1); //answer의 각 행 삽입
}
return answer;
}