끄적끄적 개발공부

# 2차원 배열 시계방향으로 회전하기

HYuk 2021. 4. 12. 21:08
728x90

5*5의 2차원 배열을 시계방향으로 회전하려고 한다.

 

1       2       3       4       5
6       7       8       9      10
11     12     13     14      15
16     17     18     19      20
21     22     23     24      25

 

인 배열을 

 

21      16      11      6       1
22      17      12      7       2
23      18      13      8       3
24      19      14      9       4
25      20      15     10      5

 

로 회전을 시켜 주는 것이다.

 

5*5 행렬은 다음과 같이 초기화 할 수 있다.

#include <iostream>

using namespace std;

void main()
{
	int iArr[5][5] = {};

	for (int i = 0; i < 5; ++i)
	{
		for (int j = 0; j < 5; ++j)
		{
			iArr[i][j] = i * 5 + j + 1;
		}
	}
}

 

이제 시계방향으로 한번 회전해야 하는데,

규칙을 찾아야한다.

규칙을 찾기위해 아래와 같이 작성 해 보았다.

 

[0][0]인 배열은 편의상 00

[0][1]인 배열은 편의상 01 으로 작성했다.

 

00 01 02 03 04
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34
40 41 42 43 44

 

위와 같은 배열에서 시계방향으로 90도 회전했을때 변하는 값을 아래와 같이 작성했다.

00->04 // +0 +4
01->14 // +1 +3
02->24 // +2 +2
03->34 // +3 +1
04->44 // +4 +0

10->03 // -1 +3
11->13 // +0 +2
12->23 // +1 +1
13->33 // +2 +0
14->43 // +3 -1

20->02 // -2 +2
21->12 // -1 +1
22->22 // +0 +0
23->32 // +1 -1
24->42 // +2 -2

30->01 // -3 +1
31->11 // -2 -0
32->21 // -1 -1
33->31 // -0 -2
34->41 // +1 -3

40->00 // -4 -0
41->10 // -3 -1
42->20 // -2 -2
43->30 // -1 -3
44->40 // -0 -4

 

이렇게 쓰고 나고 유심히 살펴보니 규칙이 있다!!

 

첫번째 항목을 보면,

왼쪽은 00 01 02 03 04

오른쪽은 04 14 24 34 44

 

왼쪽은 10 11 12 13 14 (왼쪽 숫자가 0에서 1로 증가했다)

오른쪽은 03 13 23 33 43 (오른쪽 숫자가 4에서 3으로 감소했다)

 

이걸 보고 이중for문을 사용하면 된다고 생각을 했다.

 

하지만 이때 iArr에 그대로 대입하면 순서가 꼬일 수 있으므로

새로운 iNArr배열을 만들어서 거기에 대입 후

iNArr를 다시 iArr에 덮어쓰는 방식을 사용했다.

 

해당 규칙을 다음과 같은 코드로 작성 해 보았다.

 

#include <iostream>

using namespace std;

void main()
{
	int iArr[5][5] = {};
	int iNArr[5][5] = {};
	// 초기화
	for (int i = 0; i < 5; ++i)
	{
		for (int j = 0; j < 5; ++j)
		{
			iArr[i][j] = i * 5 + j + 1;
		}
	}
	// 출력
	for (int i = 0; i < 5; ++i)
	{
		for (int j = 0; j < 5; ++j)
		{
			cout << iArr[i][j] << '\t';
		}
		cout << endl;
	}
	
	cout << "===========================================" << endl;
	//회전값을 iNArr에 저장
	for (int i = 0; i < 5; ++i)
	{
		for (int j = 0; j < 5; ++j)
		{
			iNArr[j][4 - i] = iArr[i][j];
		}
	}
	//iNarr값을 iArr에 대입
	for (int i = 0; i < 5; ++i)
	{
		for (int j = 0; j < 5; ++j)
		{
			iArr[i][j] = iNArr[i][j];
		}
	}
	// 출력
	for (int i = 0; i < 5; ++i)
	{
		for (int j = 0; j < 5; ++j)
		{
			cout << iArr[i][j] << '\t';
		}
		cout << endl;
	}

}

회전값이 잘 출력된다.

728x90