본문 바로가기
공부

복습 - 행렬 회전 과제

by MY블로그 2022. 11. 9.

전치행렬을 이해하고난뒤

상하의좌표와 좌우의 좌표를 스왑시키는 형태가 이해가 잘 되지 않아 복습을 진행하였다.

배열을 회전시키는결과값은 결국 좌표가 바뀌는 것이다.

 

이해안될때 이중포문의 좌표 할당을 손으로 그려보고 다시한번 이해할 필요가 있다.

#include<iostream>
using namespace std;

void Swap(int& sour, int& dest) //스왑 함수
{// temp(빈공간에) sour대입 sour에dest데입 dest에 temp에있던sour대입
	int temp = sour;
	sour = dest;
	dest = temp;
}

void TransPose(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 ChangeUpDown(int** matrix, int size) //위아래 자리바꾸기
{
	for (int y = 0; y < size/2; y++) //중앙을 기점으로 반쪽만 바귀기때문에 /2!
	{ // C++에서 나누기는 몫을 나타내는것임을 잊지 않아야 한다.
		for (int x = 0; x < size; x++)
		{
			Swap(matrix[x][y], matrix[x][size -1 -y]); //x는 그대로 y 좌표만 변경
		}
	}
}

void ChangeLeftRight(int** matrix, int size) //좌우 자리바꾸기
{
	for (int y = 0; y < size; y++)
	{
		for (int x = 0; x < size/2; x++)//중앙을 기점으로 반쪽만 바귀기때문에 /2!
		{
			Swap(matrix[x][y], matrix[size - 1 - x][y]); //y는 그대로 x 좌표만 변경
		}
	}
}



int main()
{
	int size, input;
	int** matrix;
	
	cout << "큐브의 크기를 입력해 주세요 : "; cin >> size;

	matrix = new int* [size];
	for (int i = 0; i < size; i++) //포인터와 더블포인터로 int형 size크기의 힙영역에 배열공간생성
	{
		matrix[i] = new int[size];
	}

	for (int y = 0; y < size; y++) //매트릭스 가로세로size 크기의 배열생성
	{
		for (int x = 0; x < size; x++)
		{
			matrix[x][y] = y * size + x;
		}
	}

	while(true)
	{
		system("cls");
		for (int y = 0; y < size; y++) //매트릭스 가로세로size 크기의 배열 출력
		{
			for (int x = 0; x < size; x++)
			{
				cout << matrix[x][y] << "\t";
			}
			cout << endl;
		}

		cout << "회전할 방향을 선택해 주세요. [1]좌회전 / [2]오른쪽 : "; cin >> input;

		if (input == 1)
		{
			TransPose(matrix, size); //전치행렬 교환
			ChangeUpDown(matrix, size); //상하 교환
			//전치행렬로 대각선 방향의좌표를 서로 교환하고
			//x축의좌표 즉, 상하의 위치를 교환하면 좌회전한 배열과 같은형태가된다.
		}
		else if (input == 2)
		{
			TransPose(matrix, size); //전치행렬 교환
			ChangeLeftRight(matrix, size); //좌우 교환
			//좌회전과 마찬가지로 전치행렬로 교환한뒤
			//상하가아닌 좌우의 좌표를 교환하면 우회전한 배열과 같은 형태가 된다.
		}
		else
		{
			cout << "잘못입력하셨습니다. 다시 입력해 주세요." << endl;
			continue;
		}

	}
	for (int i = 0; i < size; i++)
	{
		delete[] matrix[i]; //포인터사용후 할당 해제 잊지말자.
	}
	delete[] matrix; //마찬가지로 해제

	return 0;
}

'공부' 카테고리의 다른 글

시험 오답 노트(복습용/비공개)  (0) 2022.11.13
22.11.09 복습  (0) 2022.11.09
[C++] 벡터(vector)와 벡터의 멤버함수 에 대하여  (0) 2022.11.08
[C++] STL 에 대하여  (0) 2022.11.08
복습2 - 연산자  (0) 2022.11.08

댓글