카테고리 없음

(C언어/행렬) 동적 메모리를 이용한 M by N 전치행렬 구현

미친토끼 2021. 2. 27. 23:34
// M by N 행렬을 전치(transpose)한다.
// static 배열을 사용하지 않고 main에서 동적 메모리를 할당하여 그 주소를 전치 함수에게 넘기면,
// 전치함수는 그 주소의 데이터를 전치하여 변경된 값들의 주소를 되넘긴다.
// 이렇게 하는 이유는 전치 함수를 범용으로 사용할 수 있도록 하기 위해서다.
// static 2차원 배열을 넘길 경우에는 함수의 2차원 배열 인자에 col의 갯수를 명시해야 해서, 범용 함수가 되지 못하기 때문이다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printMatrix(int *array[], int row, int col) {
	int i, j;
	for (i = 0; i < row; i++) {
		for (j = 0; j < col; j++)
			printf("%d\t", array[i][j]);
		printf("\n");
	}
}

// M by N 행렬을 전치(transpose)한다.
// *origianl[] : 전치할 대상  *transpose[] : 전치해서 저장할 곳
// row: 행   col: 열 
void transposeMbyN(int *original[], int *transposed[], int row, int col) {
	int i, j, count = 0;

	for (i = 0; i < row; i++) {
		for (j = 0; j < col; j++) {
			transposed[j][i] = original[i][j]; // 행과 열 인덱스를 바꾸어 저장.
			count++;
		}
	}
	printf("%d개의 원소를 전치했습니다.\n", count);
}

int main() {
	const int row = 3;
	const int col = 4;
	int **original = NULL;
	int **transposed = NULL;
	int i, j;
	int array[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };

	// original matrix를 위한 동적 메모리 할당
	// 첫 할당은 int * row개 : row의 데이터 배열을 가리키기 위한 것
	// 두번째 할당은 int 형 col개 : 실제 데이터 저장을 위한 것
	original = (int **)calloc(row, sizeof(int *));
	for (i = 0; i < row; i++) {
		original[i] = (int *)calloc(col, sizeof(int));
		for (j = 0; j < col; j++)
			original[i][j] = array[i][j];
	}
	printMatrix(original, 3, 4);

	// transpose된 데이터를 저장하기 위한 동적 메모리 할당;
	// 할당하는 col과 row 개수가 original matrix의 그것과 뒤바뀐다. 전치된 shape을 따라가야 하기 때문이다.
	transposed = (int **)calloc(col, sizeof(int *));
	for (i = 0; i < col; i++)
		transposed[i] = (int *)calloc(row, sizeof(int));

	//printMatrix(transposed, 4, 3);
	printf("-------------------------------\n");

	transposeMbyN(original, transposed, 3, 4);
	printMatrix(transposed, 4, 3);

	//할당 받은 original 메모리 해제 
	for (i = 0; i < row; i++)
		free(original[i]);
	free(original);

	// 할당 받은 transposed 메모리 해제
	for (i = 0; i < col; i++)
		free(transposed[i]);
	free(transposed);

	return 0;
}

------------출력 결과---------

1       2       3       4
5       6       7       8
9       10      11      12
-------------------------------
12개의 원소를 전치했습니다.
1       5       9
2       6       10
3       7       11
4       8       12