문제 정의
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) 등 같은 구조의 반복문만 살짝 수정하면 다양한 배열 연산을 응용할 수 있으니, 직접 코드를 변형해 보며 감각을 익혀보시기 바랍니다.