상세 컨텐츠

본문 제목

2-4 9*9행렬을 3*3곱하기로 나눠서 연산

과제

by 근성 2021. 7. 29. 14:51

본문

9*9 행렬의 곱셈문제 직접적으로 곱하지 않고, 3*3곱하기로 나눠 서 해야합니다.

그 과정마다 출력해아합니다.

9*9의 초기 행렬값은 0부터 오름차순으로 해서 0~80까지 이고, 3*3으로 계산하는 과정을 보여줘야합니 다.

 

이번문제는 문제설명도 어렵고, 조교님들의 설명해주시는 강의도 이해가 가지 않았습니다.

출처 : 광운대학교 21년도1학기 객체지향프로그래밍2차과제

문제 설명을 그림으로 설명하면은 이렇게 되고, 저런식으로 코드를 짤경우에는

이런식으로 출력을 해야됩니다.

저는 이문제를 해결하는데 대략 2, 3일정도 걸렸던것 같은데 마땅히 좋은방법이 생각이 안나서

노가다 방식으로 풀었습니다.

 

#include<iostream>

using namespace std;

int main()
{
	int*** matrix;
	matrix = new int** [9];

	for (int s = 0; s < 9; s++)
	{
		*(matrix + s) = new int* [3];
		for (int e = 0; e < 3; e++)
		{
			*(*(matrix + s) + e) = new int[3];
		}
	}//처음 행렬값을 받을 포인터 할당

	int*** result_matrix;
	result_matrix = new int** [9];
	for (int s = 0; s < 9; s++)
	{
		*(result_matrix + s) = new int* [3];
		for (int e = 0; e < 3; e++)
		{
			*(*(result_matrix + s) + e) = new int[3];
		}
	}//결과값을 받을 포인터 할당
	for (int i = 0; i < 9; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			for (int k = 0; k < 3; k++)
			{
				matrix[i][j][k] = 3 * i + 9 * j + k;
				if (2 < i && i <= 5)
					matrix[i][j][k] += 18;
				else if (i >= 6)
					matrix[i][j][k] += 36;
			}
		}
	}//처음 행렬 초기값

	for (int i = 0; i < 9; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			for (int k = 0; k < 3; k++)
			{
				result_matrix[i][j][k] = 0;
			}
		}
	}//결과 행렬 초기값

	for (int i = 0; i < 27; i++) {

		cout << "N = " << i + 1 << endl; //i의 수치에 따라

		for (int j = 0; j < 3; j++)
		{
			for (int k = 0; k < 3; k++)//행렬 곱셉의 과정
			{
				if (i < 3) {
					result_matrix[i / 3][j][k] = matrix[i][j][0] * matrix[3 * i][0][k] + matrix[i][j][1] * matrix[3 * i][1][k]
						+ matrix[i][j][2] * matrix[3 * i][2][k] + result_matrix[i / 3][j][k];
				}
				else if (i < 6) {
					result_matrix[i / 3][j][k] = matrix[i - 3][j][0] * matrix[3 * i - 8][0][k] + matrix[i - 3][j][1] * matrix[3 * i - 8][1][k]
						+ matrix[i - 3][j][2] * matrix[3 * i - 8][2][k] + result_matrix[i / 3][j][k];
				}
				else if (i < 9) {
					result_matrix[i / 3][j][k] = matrix[i - 6][j][0] * matrix[3 * i - 16][0][k] + matrix[i - 6][j][1] * matrix[3 * i - 16][1][k]
						+ matrix[i - 6][j][2] * matrix[3 * i - 16][2][k] + result_matrix[i / 3][j][k];
				}
				else if (i < 12) {
					result_matrix[i / 3][j][k] = matrix[i - 6][j][0] * matrix[3 * i - 27][0][k] + matrix[i - 6][j][1] * matrix[3 * i - 27][1][k]
						+ matrix[i - 6][j][2] * matrix[3 * i - 27][2][k] + result_matrix[i / 3][j][k];
				}
				else if (i < 15) {
					result_matrix[i / 3][j][k] = matrix[i - 9][j][0] * matrix[3 * i - 35][0][k] + matrix[i - 9][j][1] * matrix[3 * i - 35][1][k]
						+ matrix[i - 9][j][2] * matrix[3 * i - 35][2][k] + result_matrix[i / 3][j][k];
				}
				else if (i < 18) {
					result_matrix[i / 3][j][k] = matrix[i - 12][j][0] * matrix[3 * i - 43][0][k] + matrix[i - 12][j][1] * matrix[3 * i - 43][1][k]
						+ matrix[i - 12][j][2] * matrix[3 * i - 43][2][k] + result_matrix[i / 3][j][k];
				}
				else if (i < 21) {
					result_matrix[i / 3][j][k] = matrix[i - 12][j][0] * matrix[3 * i - 54][0][k] + matrix[i - 12][j][1] * matrix[3 * i - 54][1][k]
						+ matrix[i - 12][j][2] * matrix[3 * i - 54][2][k] + result_matrix[i / 3][j][k];
				}

				else if (i < 24) {
					result_matrix[i / 3][j][k] = matrix[i - 15][j][0] * matrix[3 * i - 62][0][k] + matrix[i - 15][j][1] * matrix[3 * i - 62][1][k]
						+ matrix[i - 15][j][2] * matrix[3 * i - 62][2][k] + result_matrix[i / 3][j][k];
				}
				else if (i < 27) {
					result_matrix[i / 3][j][k] = matrix[i - 18][j][0] * matrix[3 * i - 70][0][k] + matrix[i - 18][j][1] * matrix[3 * i - 70][1][k]
						+ matrix[i - 18][j][2] * matrix[3 * i - 70][2][k] + result_matrix[i / 3][j][k];
				}
			}

		}
		{
			for (int b = 0; b < 9; b++)//결과 행렬 출력 과정
			{
				for (int c = 0; c < 3; c++)
				{
					cout << result_matrix[b][0][c] << "\t";
					if ((b == 2 || b == 5 || b == 8) && c == 2)
					{
						cout << endl;
						for (int d = 0; d < 3; d++) {
							for (int a = 0; a < 3; a++)
								cout << result_matrix[b - 2 + d][1][a] << "\t";

						}cout << endl;
						for (int d = 0; d < 3; d++) {
							for (int a = 0; a < 3; a++)
								cout << result_matrix[b - 2 + d][2][a] << "\t";

						}cout << endl;

					}
				}
			}
			cout << "\n" << endl;
		}
	}
	for (int s = 0; s < 9; s++)//초기 행렬 메모리해제
	{

		for (int e = 0; e < 3; e++)
		{
			delete[] * (*(matrix + s) + e);
		}
		delete[] * (matrix + s);
	}
	delete[] matrix;
	for (int s = 0; s < 9; s++)//결과 행렬 메모리해제
	{

		for (int e = 0; e < 3; e++)
		{
			delete[] * (*(result_matrix + s) + e);
		}
		delete[] * (result_matrix + s);
	}
	delete[] result_matrix;


}

이렇게 해결하는게 맞는지 모르겠지만, 3차원 배열을 선언하고 거기에 맞게 메모리할당 및 해제를 해서 연산을 시켰습니다.

처음에 수를 나열할 3차원배열과, 행렬의결과 배열 두개를 선언하고, 3차원배열에서 연산을 하고 나서 결과 배열에 저장을 시킨후 인덱스에 맞게 출력을 시켰습니다.

 

이 문제는 계산보다는 출력부분에서 신경을 많이 썼던것 같습니다.

문제 요구사항은 가로로 출력을 시키라는 건데 저는 세로로 계속 출력을 해서 배열의 인덱스를 다시 잡는 경우가 생겼습니다.

 

문제가 노가다라고 생각은 했지만, 풀고나니까 배열의 개념을 좀 더 잡을 수 있는 문제였던것 같습니다.

 

#이 문제의 출처는 kw대학교 컴퓨터정보공학부 2021년 1학기 객체지향 프로그래밍 과제 문제입니다.

'과제' 카테고리의 다른 글

2-6 계좌관리 class 구현  (0) 2021.08.05
2-5 클래스 선언 후, 문자찾기  (0) 2021.08.04
2-3 함수포인터 void(*fp)() 사용  (0) 2021.07.20
2-2 단어장 만드는 프로그램  (0) 2021.07.15
2-1 2차원배열의 행정렬  (0) 2021.07.14

관련글 더보기

댓글 영역