C Programming

C언어 2차원 배열 동적 메모리 할당 후, 두 행렬의 곱 출력 - 공부하는 도비

DOVISH WISDOM 2022. 11. 6. 22:33  
728x90
반응형

사용자로부터 (n *n) 크기의 정방 행렬 두 개를 입력받은 후, 두 행렬의 곱(Matrix Multiplication) 출력

● 입력 : 정수 하나를 입력 받음

  • 2를 입력하면, (2 * 2) 행렬 2개에 대한 정수를 입력해야하므로, 각각 4가지 원소, 즉 8개 입력
  • 4를 입력하면, (4 * 4) 행렬 2개에 대한 정수를 입력해야하므로, 각각 16가지 원소, 즉 32개 입력

출력 : 입력한 두 행렬의 곱을 계산 후 출력


예시 입력

예시 입력 1
예시 입력 2
예시 입력 3


 소스코드

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


int main(void) 
{
	
	int num;
	int sum_value = 0;
	int temp = 0;
    int **arr;
    printf("행렬의 크기 (n X n) => n : ");
    scanf("%d", &num);
    
    arr = (int**)malloc(sizeof(int*) * 2 );
    
    for(int i = 0; i < num; i++) 
    {
        arr[i] = (int*)malloc(sizeof(int) * (num*num) );
    }
    
    for(int i = 0; i < 2; i++)  // 행렬 입력
	{
	    for(int j = 0; j < (num*num); j++)
	    {
	        scanf("%d", &*((*(arr+i))+j));
	    }
	}


    for(int z = 0; z < (num*num);)  // 행렬 곱
    {
        for(int i = 0; i < num; i++)
        {
            sum_value = 0;
            temp = i;
            for(int j = 0; j < num; j++)
            {
                sum_value += (arr[0][z + j] * arr[1][temp] );
                temp += num;
            }
            printf("%3d ", sum_value);
        }
        z += num;
        printf("\n");
    }
    
	
	for(int i=0; i < num; i++)  // 메모리 해제
	{
        free(arr[i]);   
    }
    free(arr);
	
	return 0;
}

● 설명 

메모리 할당을 배열로 보면 [2] X [(num*num)] 형태를 띄고 있습니다.

arr = (int**)malloc(sizeof(int*) * 2 );
    
for(int i = 0; i < num; i++)
{
        arr[i] = (int*)malloc(sizeof(int) * (num*num) );
 }

다음 코드를 아래 그림처럼 나타낼 수 있습니다. 

저런식으로 입력을 받으면, 행렬 곱셈하기가 꽤나 까다로워집니다. 

각 일차원 배열을 행렬처럼 생각해야 합니다.

따라서, 위 그림처럼 일차원 배열을 이차원처럼 동작되도록, 행렬 곱 한 것을 알 수 있습니다. 

    for(int z = 0; z < (num*num);)  // 행렬 곱
    {
        for(int i = 0; i < num; i++)
        {
            sum_value = 0;
            temp = i;
            for(int j = 0; j < num; j++)
            {
                sum_value += (arr[0][z + j] * arr[1][temp] );
                temp += num;
            }
            printf("%3d ", sum_value);
        }
        z += num;
        printf("\n");
    }

2차원 동적 메모리 할당에 대한 자세한 내용은 아래 링크를 확인해주세요.

2022.11.06 - [C언어] - [C언어] 2차원 동적 메모리 할당 - 공부하는 도비

 

[C언어] 2차원 동적 메모리 할당 - 공부하는 도비

오늘은 2차원 배열을 선언하는 것처럼,2차원 동적 메모리 할당에 대해 알아보겠습니다. 지난 피드에서 C언어 동적 메모리 할당을 알아보았습니다. 자세한 내용은 아래 링크를 참고해주세요. 2022.

yang-wistory1009.tistory.com

 

반응형