코딩

빙빙 돌아가는 회전 배열처럼...

찬이2 2022. 11. 8. 02:40

메인 배열의 회전 후의 모습을 서브 배열에 미리 저장한 뒤,

다시 서브 배열 값을 다시 메인 배열에 옮기는 방식으로 처리했다.

#include<iostream>
using namespace std;

int main()
{
	int size, input = 1;

	//배열 크기 입력
	cout << "행렬의 크기를 입력해주세요 : ";
	cin >> size;

	//메인 2차원배열 선언
	int** MainMatrix = new int* [size];
	for (int i = 0; i < size; i++)
	{
		MainMatrix[i] = new int[size];
	}
	//서브 2차원배열 선언
	int** SubMatrix = new int* [size];
	for (int i = 0; i < size; i++)
	{
		SubMatrix[i] = new int[size];
	}

	//메인 2차원배열 정의
	for (int y = 0; y < size; y++)
	{
		for (int x = 0; x < size; x++)
		{
			MainMatrix[x][y] = y * size + x;
		}
	}

	//반복시작
	while (true)
	{
		//메인 2차원배열 출력
		for (int y = 0; y < size; y++)
		{

			for (int x = 0; x < size; x++)
			{
				cout << MainMatrix[x][y] << "\t";
			}
			cout << endl << endl;
		}

		//input값 입력으로 회전방향 결정
		cout << "1.왼쪽 / 2.오른쪽 / 외 나머지 종료" << endl << "입력 : ";
		cin >> input;

		if (input == 1)
		{
			//서브배열에 메인배열이 왼쪽으로 회전했을 때의 값들을 순서대로 저장
			int index = size - 1;
			for (int y = 0; y < size; y++)
			{
				for (int x = 0; x < size; x++)
				{
					SubMatrix[x][y] = MainMatrix[index][x];
				}
				index--;
			}
		}
		else if (input == 2)
		{
			//서브배열에 메인배열이 오른쪽으로 회전했을 때의 값들을 순서대로 저장
			for (int y = 0; y < size; y++)
			{
				int index = size - 1;
				for (int x = 0; x < size; x++)
				{
					SubMatrix[x][y] = MainMatrix[y][index--];
				}
			}
		}
		else
		{
			//input값 1,2 외 입력 시 종료
			break;
		}

		//서브배열에 미리 저장해둔 회전 후 결과값들을 다시 메인배열에 초기화
		for (int y = 0; y < size; y++)
		{
			for (int x = 0; x < size; x++)
			{
				MainMatrix[x][y] = SubMatrix[x][y];
			}
		}
	}

	//동적 할당 해제
	for (int i = 0; i < size; i++)
	{
		delete[] MainMatrix[i];
		delete[] SubMatrix[i];
	}
	delete[] MainMatrix;
	delete[] SubMatrix;

	return 0;
}

2.0ver Patch Note

전치행렬을 이용한 2차원배열 회전으로 수정

서브 배열 삭제

스왑함수, 전치행렬함수, 왼쪽회전함수, 오른쪽회전함수 추가

#include<iostream>
#include<string>
#include<time.h>
#include<math.h>
using namespace std;

//스왑함수
void Swap(int& sour, int& dest)
{
	int temp = sour;
	sour = dest;
	dest = temp;
}

//전치행렬함수
void TransPos(int** matrix, int size)
{
	for (int y = 0; y < size; y++)
	{
		for (int x = y + 1; x < size; x++)
		{
			Swap(matrix[x][y], matrix[y][x]);
		}
	}
}

//왼쪽회전함수
void ChageUPDOWN(int** matrix, int size)
{
	for (int y = 0; y < size / 2; y++)
	{
		for (int x = 0; x < size; x++)
		{
			Swap(matrix[x][y], matrix[x][size - 1 - y]);
		}
	}
}

//오른쪽회전함수
void ChageLEFTRIGHT(int** matrix, int size)
{
	for (int y = 0; y < size; y++)
	{
		for (int x = 0; x < size / 2; x++)
		{
			Swap(matrix[x][y], matrix[size - 1 - x][y]);
		}
	}
}

int main()
{
	int input, size;

	cout << "행렬의 크기를 입력해주세요 : ";
	cin >> size;

	int** matrix = new int* [size];
	for (int i = 0; i < size; i++)
	{
		matrix[i] = new int[size];
	}

	for (int y = 0; y < size; y++)
	{
		for (int x = 0; x < size; x++)
		{
			matrix[x][y] = y * size + x;
		}
	}

	while (true)
	{
		for (int y = 0; y < size; y++)
		{
			for (int x = 0; x < size; x++)
			{
				cout << matrix[x][y] << "\t";
			}
			cout << endl << endl;
		}

		cout << "1.왼쪽 / 2.오른쪽 / 외 나머지 종료" << endl << "입력 : ";
		cin >> input;

		if (input == 1)
		{
			TransPos(matrix, size);
			ChageUPDOWN(matrix, size);
		}
		else if (input == 2)
		{
			TransPos(matrix, size);
			ChageLEFTRIGHT(matrix, size);
		}
		else
		{
			break;
		}
	}

	//동적 할당 해제
	for (int i = 0; i < size; i++)
	{
		delete[] matrix[i];
	}
	delete[] matrix;

	return 0;
}