코딩
빙빙 돌아가는 회전 배열처럼...
찬이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;
}