[Algorithm] 2차원 배열 돌리기

Posted by DHniyeo Blog on April 13, 2024

개요

코딩 문제를 보다 보면 구현 문제에서 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <cstring>
#define R 4
#define C 3
using namespace std;

int rotated[C][R] = { 0 };
int banjeun[R][C] = { 0 };
void printrotated() {
	for (int i = 0; i < C; i++) {
		for (int j = 0; j < R; j++) {
			cout << rotated[i][j] << " ";
		}
		cout << endl;
	}
}
void printbanjeun() {
	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			cout << banjeun[i][j] << " ";
		}
		cout << endl;
	}
}
int main() {
	int table[R][C] =
	{
		{1,2,3}, 
		{4,5,6}, 
		{7,8,9}, 
		{10,11,12}
	};

	memset(rotated, 0, sizeof(rotated));
	for (int i = 0; i < R; i++) { // 시계방향
		for (int j = 0; j < C; j++) {
			rotated[j][R - 1 - i] = table[i][j];
		}
	}
	cout << "시계방향" << endl;
	printrotated();

	memset(rotated, 0, sizeof(rotated));
	for (int i = 0; i < R; i++) { // 반시계 방향 y,x가 바뀜
		for (int j = 0; j < C; j++) {
			rotated[C - 1 - j][i] = table[i][j];
		}
	}
	cout << "반시계 방향" << endl;
	printrotated();

	memset(banjeun, 0, sizeof(banjeun));
	for (int i = 0; i < R; i++) { // 상하 반전 (y인덱스가 위아래로 반전) y,x가 뒤바뀌지 않음
		for (int j = 0; j < C; j++) {
			banjeun[R-1-i][j] = table[i][j];
		}
	}
	cout << "상하 반전" << endl;
	printbanjeun();

	memset(banjeun, 0, sizeof(banjeun));
	for (int i = 0; i < R; i++) { // 좌우 반전 (x인덱스가 좌우로 반전) y,x가 뒤바뀌지 않음
		for (int j = 0; j < C; j++) {
			banjeun[i][C-1-j] = table[i][j]; // 열의 최대 크기 3
		}
	}
	cout << "좌우 반전" << endl;
	printbanjeun();

}

결과는 다음과 같다

0

정리

1
2
3
4
rotated[j][R - 1 - i] = table[i][j]; // 시계방향 // y,x 뒤집힘, x쪽 수정
rotated[C - 1 - j][i] = table[i][j]; // 반시계방향 // y,x 뒤집힘, y쪽 수정
banjeun[R-1-i][j] = table[i][j]; // 상하반전 // y,x 안뒤집힘, y쪽 수정
banjeun[i][C-1-j] = table[i][j]; // 좌우반전 // y,x 안뒤집힘, x쪽 수정