새로새록

[c++]5. 행렬 두개와 2D vector 본문

소프트웨어융합/경희대 c++ 과제

[c++]5. 행렬 두개와 2D vector

류지나 2020. 7. 16. 19:26

행렬 두 개의 크기를 입력합니다. 두 행렬의 값들을 초기화하고, 행렬의 곱을 한 후에 출력하세요.

1) 행렬은 2D Vector를 활용하여 선언하세요.
2) 행렬의 요소 값은 –9 ~ 9 의 숫자중 하나를 랜덤으로 배정합니다.
3) 행렬을 초기화하는 함수, 행렬을 출력하는 함수, 행렬을 곱하는 함수 세 가지를 구현하시면 됩니다.
4) 두 행렬을 곱할 수 없으면 결과를 출력하지 않고 종료합니다.

#include <iostream>
#include <vector>
#include <random>
#include <iomanip>
using namespace std;

vector<vector<int>> input(int row, int col) {
	vector<vector<int>> matrix(row, vector<int>(col));
	for (vector<int>& v : matrix) {
		for (int& elem : v)
			elem = rand() % 19 - 9;
	}
	return matrix;
}

void print_vec(vector<vector<int>> v) {
	for (vector<int>& v1 : v) {
		for (int& elem : v1)
			cout << setw(6) << elem;
		cout << endl;
	}
	cout << endl;
}

vector<vector<int>> multiply(vector<vector<int>>A, vector<vector<int>>B) {
	int row1 = A.size(), col1 = A[0].size();
	int row2 = B.size(), col2 = B[0].size();
	vector<vector<int>> matrix(row1,vector<int>(col2));

	for (int i = 0; i < row1; i++) {
		for (int j = 0; j < col2; j++){
			matrix[i][j] = 0;
			for (int k = 0; k < col1; k++) 
				matrix[i][j] += A[i][k] * B[k][j];
		}
	}
	return matrix;
}

int main() {
	cout << "A의 행, 열의 크기를 입력해주세요 : ";
	int row1, row2, col1, col2;
	cin >> row1 >> col1;
	cout << "B의 행, 열의 크기를 입력해주세요 : ";
	cin >> row2 >> col2;

	vector<vector<int>> A = input(row1, col1);

	vector<vector<int>> B = input(row2, col2);

	cout << "A 행렬 :\n";
	print_vec(A);
	cout << "B 행렬 :\n";
	print_vec(B);

	if (col1 != row2) {
		cout << "두 행렬을 곱할 수 없습니다.";
		return 0;
	}

	vector<vector<int>> AB = multiply(A, B);
	cout << "AB 곱행렬 :\n";
	print_vec(AB);

	return 0;
}