Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 프로그래밍: 런타임에 2차원 배열 다루기 — 배열 요소의 합과 곱 계산하기


문제 정의

C 언어를 사용하여 런타임(실행 시점)에 입력받은 두 개의 2차원 배열에서, 같은 위치의 요소끼리 더한 값(합 배열)과 곱한 값(곱 배열)을 계산하여 출력하는 프로그램을 작성해 보겠습니다.

핵심 개념: 런타임 초기화와 동적 메모리 할당

  • 런타임 컴파일 또는 런타임 초기화는 동적 할당(dynamic allocation)이라고도 부릅니다. 프로그램 실행 중에 메모리를 할당하는 방식을 동적 메모리 할당이라고 하며, 컴파일 시점에 크기를 고정하지 않고 필요할 때 유연하게 메모리를 확보할 수 있다는 장점이 있습니다.

  • C 언어에서는 calloc()malloc() 함수가 동적 메모리 할당을 지원합니다. 두 함수는 모두 <stdlib.h> 헤더 파일에 선언되어 있으며, 실행 도중 필요한 만큼의 메모리를 힙(heap) 영역에 확보할 수 있습니다.

이번 예제에서는 사용자로부터 2행 3열 크기의 두 2차원 배열 A와 B를 입력받은 뒤, 각 위치의 요소끼리 더한 합 배열과 곱한 곱 배열을 계산하여 화면에 출력합니다.

합(Sum) 계산 로직

두 배열의 같은 인덱스에 있는 요소를 서로 더한 뒤 결과 배열에 저장하고 출력합니다.

printf("Sum array is : \n");
for(i=0;i<2;i++){
    for(j=0;j<3;j++){
        sum[i][j] = A[i][j] + B[i][j];
        printf("%d\t", sum[i][j]);
    }
    printf("\n");
}

곱(Product) 계산 로직

구조는 합 계산과 완전히 동일하며, 덧셈 연산자(+)만 곱셈 연산자(*)로 바꾸면 됩니다.

printf("Product array is : \n");
for(i=0;i<2;i++){
    for(j=0;j<3;j++){
        product[i][j] = A[i][j] * B[i][j];
        printf("%d\t", product[i][j]);
    }
    printf("\n");
}

전체 예제 코드

#include <stdio.h>

void main() {
    // 배열 선언 (런타임) //
    int A[2][3], B[2][3], i, j;
    int sum[2][3], product[2][3];

    // for문을 이용해 배열 A에 값 입력 //
    printf("Enter elements into the array A: \n");
    for(i = 0; i < 2; i++) {
        for(j = 0; j < 3; j++) {
            printf("A[%d][%d] : ", i, j);
            scanf("%d", &A[i][j]);
        }
        printf("\n");
    }

    // for문을 이용해 배열 B에 값 입력 //
    for(i = 0; i < 2; i++) {
        for(j = 0; j < 3; j++) {
            printf("B[%d][%d] : ", i, j);
            scanf("%d", &B[i][j]);
        }
        printf("\n");
    }

    // 합 계산 후 출력 //
    printf("Sum array is : \n");
    for(i = 0; i < 2; i++) {
        for(j = 0; j < 3; j++) {
            sum[i][j] = A[i][j] + B[i][j];
            printf("%d\t", sum[i][j]);
        }
        printf("\n");
    }

    // 곱 계산 후 출력 //
    printf("Product array is : \n");
    for(i = 0; i < 2; i++) {
        for(j = 0; j < 3; j++) {
            product[i][j] = A[i][j] * B[i][j];
            printf("%d\t", product[i][j]);
        }
        printf("\n");
    }
}

실행 결과

Enter elements into the array A:
A[0][0] :A[0][1] :A[0][2] :
A[1][0] :A[1][1] :A[1][2] :
B[0][0] :B[0][1] :B[0][2] :
B[1][0] :B[1][1] :B[1][2] :
Sum array is :
000
000
Product array is :
000
000

코드 설명 및 주요 포인트

  • 배열 크기 지정: 일부 자료에서는 int sum[i][j]처럼 변수로 배열 크기를 선언하기도 하는데, 이 시점의 i와 j는 아직 값이 정해지지 않았으므로 예측 불가능한 동작을 일으킬 수 있습니다. 따라서 위 예제에서는 int sum[2][3], int product[2][3]으로 크기를 명확히 지정했습니다.

  • 중첩 반복문: 바깥쪽 for문은 행(row)을, 안쪽 for문은 열(column)을 순회하며 2차원 배열의 모든 요소에 순차적으로 접근합니다.

  • 입력 처리: scanf() 함수로 사용자 입력을 받아 각 배열 요소에 저장하므로, 배열의 값은 프로그램 실행 시점(런타임)에 결정됩니다.

  • 동적 할당 활용: 배열 크기를 미리 알 수 없는 상황이라면 malloc()이나 calloc()으로 메모리를 동적으로 할당하면 더욱 유연하고 효율적인 프로그램을 작성할 수 있습니다.

마무리

이처럼 C 프로그래밍에서는 중첩 for문과 2차원 배열을 조합하면 행렬 형태의 데이터를 손쉽게 처리할 수 있습니다. 합과 곱 외에도 차이, 나눗셈, 전치(transpose) 등 같은 구조의 반복문만 살짝 수정하면 다양한 배열 연산을 응용할 수 있으니, 직접 코드를 변형해 보며 감각을 익혀보시기 바랍니다.