2차원 배열 90도 회전
2차원으로 선언된 배열을 2중 for문을 이용하여 90도 회전 시킬 수 있습니다.
memmove( 배열 A 시작 주소, 배열 B 시작 주소, 크기 )
배열간의 값 복사를 할 수 있는 함수로 B의 배열 값들을 A로 복사하는 기능을 제공합니다.
관련 글
알고리즘 문제를 풀다보면 2차원 배열을 계속해서 회전시켜야할 때가 있습니다. 90도, 180도, 270도 회전을 시킬 때 각각을 구현하여 문제를 해결할 수 있겠지만, 90도 회전하는 법을 알면 함수로 선언 후 반복적으로 이용하면 됩니다. 이렇게 하는 것이 코드도 깔끔해지고 시간도 절약할 수 있습니다.
2차원 배열을 90도 회전시키는 방법은 2중 for문을 이용해 행렬을 서로 바꿔주면 쉽게 해결할 수 있습니다. 하지만 새로 바뀌어야하는 배열의 index를 정하는 것이 매번 헷갈릴 수 있지만 한번만 익혀두면 많은 알고리즘 문제에서 유용하게 사용할 수 있으니 꼭 공부하시길 바래요.
90도 회전의 좌표 변화
배열을 90도 회전시키기 위한 예시를 하나 만들겠습니다. 5x5의 2차원 배열이 다음과 같이 있다고 가정합시다. 각 숫자들은 Row, Column의 좌표 값을 의미합니다.
위의 배열을 시계 방향으로 90도 회전한다고 가정할 때 전체 좌표의 변화 값을 생각하면 복잡하니, 첫번째 열의 좌표 값들이 어떻게 변하는지 보겠습니다.
90도 회전 시키기 전의 배열을 A, 회전 이후의 배열을 B라고 가정할 때, 90도 회전 시켰을 때 A의 1열은 B의 1행이 됩니다. A의 1열과 B의 1행의 각 좌표를 비교하기 위해 A 1열을 90도 회전 후 나란히 위치시키겠습니다.
위의 그림을 보면 일단 가장 먼저 A의 Column 값이 B의 Row으로 된다는 것을 쉽게 파악할 수 있습니다. 문제는 A의 Row 값입니다. 자세히 보면 B의 Column 값이 증가함에 따라 A의 Row 값은 감소한다는 것을 알 수 있습니다. 그래서 결론적으로 2차원 배열 B를 표현한다면 다음과 같이 정리할 수 있습니다.
B[ B Row ][ B Column ] = A[ N - B Column - 1 ][ B Row ] |
배열 값 복사하기
90도 회전 시 좌표 값의 변화를 알았지만 이 변화된 값들을 어떻게 기존 배열에 넣어줄 수 있을까요? 보통 가장 쉽게 생각한다면 똑같은 크기의 temp 배열을 만든 뒤 2중 for문을 이용해 값을 대입시킬 수 있습니다. 하지만 이렇게 한다면 회전을 위한 2중 for문과 값 복사를 위한 2중 for문이 연달아 사용되기 때문에 지저분한 코딩이 될 수 있습니다. 그런데 배열 간의 값 복사는 이미 함수로 존재한다는 것을 알고 계셨나요?
memmove() 함수를 이용하면 2차원 배열 간의 값 이동을 쉽게 할 수 있습니다. 함수 parameter는 이렇습니다. memmove( 배열 A 시작 주소, 배열 B 시작 주소, 크기 ) 로 정의되며 2차원 배열 간의 값 복사는 쉽게 생각해서 배열 이름을 넣어주면 됩니다. ( Parameter의 의미를 이해하면 2차원 배열의 특정 행렬 값만 복사시킬 수 있습니다. ) memmove()를 이용한 2차원 배열의 90도 회전의 코드 예시는 아래와 같습니다.
C++ Code
#include <iostream>
#include <string.h>
using namespace std;
#define N 10
int arr[N][N], temp_arr[N][N];
void init(){
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
arr[i][j] = i*10 + j;
}
void print_arr(){
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
cout.width(2);
cout << arr[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
int main()
{
init();
print_arr();
// 배열 90도 회전
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
temp_arr[i][j] = arr[N - j -1][i];
// 배열 값 복사
memmove(arr, temp_arr, sizeof(arr));
print_arr();
}
'Computer Science > C++' 카테고리의 다른 글
[C++] Split #2 - multiple delimiter split 함수 구현 (0) | 2021.02.02 |
---|---|
[C++] Split #1 - String delimiter split 함수 구현 (0) | 2021.01.28 |
[C++] 2차원 배열 행렬 바꾸기 (0) | 2021.01.25 |
[C++] 2차원 배열 특정 값 초기화 (0) | 2021.01.17 |
[C++] 구조체 생성자 오버로딩 Struct Constructor Overloading (0) | 2021.01.10 |