2차원 배열 행렬 바꾸기
2차원으로 선언된 배열을 2중 for문을 이용하여 행렬을 바꿀 수 있습니다.
memmove( 배열 A 시작 주소, 배열 B 시작 주소, 크기 )
배열간의 값 복사를 할 수 있는 함수로 B의 배열 값들을 A로 복사하는 기능을 제공합니다.
관련 글
지난번에 올렸던 2차원 배열 90도 회전에 이어서 이번에는 2차원 배열 행렬 바꾸기를 소개하겠습니다. 사실 행렬 바꾸기는 90도 회전에 비해서 상당히 간단합니다. 하지만 유용한 함수를 사용하지 않으면 2중 for문이 반복적으로 사용되기 때문에 지저분한 코딩이 될 수 있습니다. 그래서 90도 회전과 마찬가지로 memmove() 함수를 사용하면서 코드를 비교적 깔끔하게 작성할 수 있습니다.
행렬 바꾸기의 좌표 변화
배열의 행렬을 바꾸기위한 예시를 하나 만들겠습니다. 5x5의 2차원 배열이 다음과 같이 있다고 가정합시다. 각 숫자들은 Row, Column의 좌표 값을 의미합니다.
위 배열의 행렬을 바꾼다고 가정할 때 전체 좌표의 변화 값을 생각하면 복잡하니, 두번째 열의 좌표 값들이 어떻게 변하는지 보겠습니다.
행렬 바꾸기 전의 배열을 A, 행렬 바꾸기 이후의 배열을 B라고 가정할 때, 행렬을 바꿀 때 A의 2열은 B의 2행이 됩니다. A의 2열과 B의 2행의 각 좌표를 비교하기 위해 A 2열을 행렬 바꾸기 후 나란히 위치시키겠습니다.
위의 그림을 보면 규칙을 쉽게 파악할 수 있습니다. A의 Row는 B의 Column이 되고 반대로 A의 Column은 B의 Row가 되기 때문에 index를 서로 바꿔주기만 하면 됩니다. 그래서 결론적으로 2차원 배열 B를 표현한다면 다음과 같이 정리할 수 있습니다.
B[ B Row ][ B Column ] = A[ B Column ][ B Row ] |
배열 값 복사하기
90도 회전 시 좌표 값의 변화를 알았지만 이 변화된 값들을 어떻게 기존 배열에 넣어줄 수 있을까요? 보통 가장 쉽게 생각한다면 똑같은 크기의 temp 배열을 만든 뒤 2중 for문을 이용해 값을 대입시킬 수 있습니다. 하지만 이렇게 한다면 회전을 위한 2중 for문과 값 복사를 위한 2중 for문이 연달아 사용되기 때문에 지저분한 코딩이 될 수 있습니다. 그런데 배열 간의 값 복사는 이미 함수로 존재한다는 것을 알고 계셨나요?
memmove() 함수를 이용하면 2차원 배열 간의 값 이동을 쉽게 할 수 있습니다. 함수 parameter는 이렇습니다. memmove( 배열 A 시작 주소, 배열 B 시작 주소, 크기 ) 로 정의되며 2차원 배열 간의 값 복사는 쉽게 생각해서 배열 이름을 넣어주면 됩니다. ( Parameter의 의미를 이해하면 2차원 배열의 특정 행렬 값만 복사시킬 수 있습니다. ) memmove()를 이용한 2차원 배열의 행렬 바꾸기 코드 예시는 아래와 같습니다.
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();
// 배열 행렬 바꾸기
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
temp_arr[i][j] = arr[j][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차원 배열 90도 회전 (2) | 2021.01.23 |
[C++] 2차원 배열 특정 값 초기화 (0) | 2021.01.17 |
[C++] 구조체 생성자 오버로딩 Struct Constructor Overloading (0) | 2021.01.10 |