c++/알고리즘

c++ 행렬 곱셈

hojung 2022. 3. 16.
728x90
반응형

1. 문제

- n^3(Cubic complexity)를 만족하는 3중 for루프 곱(2차 행렬 a, b, c 곱셈)

 

- Cubic complextiy 알고리즘의 경우 n=10, 50, 100, 150, 200 을 사용하여 결과 출력

 

입력 행렬의 크기가 달라져야하기 때문에 크기가 가변적인 벡터를 사용해서 할 것임 

int SIZE = 200;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
	vector<vector<int>> ans(arr1.size(), vector<int>(arr2[0].size(), 0));	//2차원 배열 선언, 0으로 초기화

	// arr1의 i행, arr2의 j열을 곱한다
	// 인덱스 이동은 k
		for (int i = 0; i < SIZE; i++) {
			for (int j = 0; j < SIZE; j++) {
				int sum = 0;
				for (int k = 0; k < SIZE; k++) {
					sum += arr1[i][k] * arr2[k][j];
				}
				ans[i][j] = sum;
			}
		}
	return ans;
}

int 형 2차원 벡터 2개를 받아 행렬 곱셈 연산을 수행한다. 이 때 나타내져야하는 인덱스는 3가지이다. 한가지는 한 행렬의 크기를 나타내는 인덱스, 다른 행렬의 크기를 나타내는 인덱스, 행렬 간 연산을 하면서 곱해지는 인덱스가 0 -> 1->2로 이동을 하는데 이 이동을 의미하는 인덱스 총 3가지이다. 

 

void main() {
	clock_t start, finish;
	double duration;
	start = clock();
	//make matrix
	vector<std::vector<int>> A(SIZE, std::vector<int>(SIZE, 2));
	vector<std::vector<int>> B(SIZE, std::vector<int>(SIZE, 2));
	vector<std::vector<int>> C(SIZE, std::vector<int>(SIZE, 2));

	vector<vector<int>> ans = solution(A, B);
	vector<vector<int>> result = solution(ans, C);

	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	cout << duration << "초" << endl;

}

위에 작성한 함수를 메인 함수에서 실행시키면 문제없이 작동한다. 

 

결과 화면&nbsp;

 

728x90
반응형

'c++ > 알고리즘' 카테고리의 다른 글

백준2178번-미로BFS  (0) 2022.03.28
shell sort c++  (0) 2022.03.23
백준 9996  (0) 2022.03.19
백준 1159  (0) 2022.03.18
피보나치 수열  (0) 2022.03.16

댓글