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

C 언어로 행렬의 경계 요소 합 구하기: 예제 코드와 상세 해설

프로그래밍 학습에서 행렬(matrix) 문제는 빠질 수 없는 주제입니다. 이 글에서는 주어진 행렬의 경계(테두리) 요소를 출력하고, 해당 요소들의 합을 계산하는 C 프로그램 작성 방법을 예제와 함께 자세히 알아보겠습니다.

문제 이해하기

행렬의 경계 요소란 첫 번째 행, 마지막 행, 첫 번째 열, 마지막 열에 위치한 모든 요소를 의미합니다. 즉, 행렬의 가장자리에 있는 값들이 경계 요소가 됩니다. 아래 예제를 통해 쉽게 이해할 수 있습니다.

예제 행렬

1 2 3
4 5 6
7 8 9

경계 행렬

1 2 3
4   6
7 8 9

위 3×3 행렬에서 내부에 있는 값인 5를 제외한 나머지 요소가 모두 경계 요소입니다.

경계 요소의 합: 1 + 2 + 3 + 4 + 6 + 7 + 8 + 9 = 40

핵심 로직

경계 요소를 판별하는 핵심은 간단합니다. 이중 반복문으로 행렬의 모든 요소를 순회하면서, 현재 위치가 다음 네 가지 조건 중 하나라도 만족하면 경계 요소로 판단합니다.

  • i == 0 → 첫 번째 행
  • i == m-1 → 마지막 행
  • j == 0 → 첫 번째 열
  • j == n-1 → 마지막 열

조건을 만족하는 요소는 화면에 출력하고 합계 변수에 더하며, 그렇지 않은 내부 요소는 공백으로 대체하여 출력합니다.

for(i = 0; i<m; i++){
    for(j = 0; j<n; j++){
        if (i == 0 || j == 0 || i == m - 1 || j == n - 1){
            printf("%d ", mat[i][j]);
            sum = sum + mat[i][j];
        }
        else
            printf(" ");
    }
    printf("\n");
}

C 프로그램 전체 코드

다음은 행렬의 경계 요소를 출력하고 그 합을 계산하는 완전한 C 프로그램입니다.

#include<stdio.h>
int main(){
    int m, n, sum = 0;
    printf("\nEnter the order of the matrix : ");
    scanf("%d %d",&m,&n);
    int i, j;
    int mat[m][n];
    printf("\nInput the matrix elements\n");
    for(i = 0; i<m; i++){
        for(j = 0; j<n; j++)
            scanf("%d",&mat[i][j]);
    }
    printf("\nBoundary Matrix\n");
    for(i = 0; i<m; i++){
        for(j = 0; j<n; j++){
            if (i == 0 || j == 0 || i == m - 1 || j == n - 1){
                printf("%d ", mat[i][j]);
                sum = sum + mat[i][j];
            }
            else
                printf(" ");
        }
        printf("\n");
    }
    printf("\nSum of boundary is %d", sum);
    return 0;
}

실행 결과

위 프로그램을 컴파일 후 실행하면 다음과 같은 결과가 출력됩니다.

Enter the order of the matrix : 3 3
Input the matrix elements :
1 2 3
4 5 6
7 8 9
Boundary Matrix :
1 2 3
4 6
7 8 9
Sum of boundary is 40

코드 동작 원리 정리

프로그램의 흐름을 단계별로 살펴보면 다음과 같습니다.

  1. 사용자로부터 행렬의 크기(m×n)를 입력받습니다.
  2. 가변 길이 배열(VLA)을 선언하고, 이중 반복문을 통해 행렬 요소를 입력받아 저장합니다.
  3. 다시 이중 반복문으로 모든 요소를 순회하며 경계 여부를 검사합니다.
  4. 경계 요소라면 값을 출력하고 sum에 누적하며, 내부 요소라면 공백을 출력해 경계 행렬 형태를 만듭니다.
  5. 모든 순회가 끝나면 최종 합계를 출력합니다.

이 알고리즘의 시간 복잡도는 행렬의 모든 요소를 한 번씩만 확인하므로 O(m×n)이며, 추가 메모리 없이 기존 배열만 사용하므로 공간 복잡도는 O(1)입니다. 참고로, 정방 행렬(n×n)뿐 아니라 직사각형 행렬에서도 올바른 결과를 얻으려면 마지막 행 조건을 i == m - 1로, 마지막 열 조건을 j == n - 1로 작성해야 한다는 점에 유의하세요.