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

C++로 행렬의 각 행과 열의 합 구하기: 초보자를 위한 완벽 가이드

행렬의 행 합과 열 합 계산이란?

이 튜토리얼에서는 주어진 행렬(matrix)에서 각 행의 합각 열의 합을 구하는 C++ 프로그램을 다룹니다.

예를 들어 A*B 크기의 행렬이 주어졌을 때, 우리가 해야 할 일은 행렬의 모든 요소를 순회하면서 각 행별 합계와 각 열별 합계를 차례로 계산하는 것입니다.

해결 접근 방법

가장 기본적이고 직관적인 방법은 이중 반복문(nested loop)을 활용하는 것입니다.

  • 행 합계: 바깥쪽 반복문이 행 인덱스를 고정하고, 안쪽 반복문이 해당 행의 모든 열 요소를 더합니다. 한 행의 합계를 출력한 뒤에는 누적 변수를 0으로 초기화합니다.
  • 열 합계: 행과 열의 인덱스 역할만 서로 바꾸면 됩니다. 즉, 바깥쪽 반복문이 열 인덱스를 고정하고, 안쪽 반복문이 그 열에 속한 행 요소들을 순서대로 더합니다.

C++ 예제 코드

#include <iostream>
using namespace std;
#define m 7
#define n 6

// 각 행의 합계 계산
void calc_rsum(int arr[m][n]) {
    int i, j, sum = 0;
    for (i = 0; i < 4; ++i) {
        for (j = 0; j < 4; ++j) {
            sum = sum + arr[i][j];
        }
        cout << "Sum of the row " << i << ": " << sum << endl;
        sum = 0; // 다음 행 계산을 위해 초기화
    }
}

// 각 열의 합계 계산
void calc_csum(int arr[m][n]) {
    int i, j, sum = 0;
    for (i = 0; i < 4; ++i) {
        for (j = 0; j < 4; ++j) {
            sum = sum + arr[j][i]; // 행과 열 인덱스를 교환
        }
        cout << "Sum of the column " << i << ": " << sum << endl;
        sum = 0; // 다음 열 계산을 위해 초기화
    }
}

int main() {
    int i, j;
    int arr[m][n];
    int x = 1;
    // 1부터 시작하는 연속된 값으로 행렬 초기화
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
            arr[i][j] = x++;

    calc_rsum(arr);
    calc_csum(arr);
    return 0;
}

실행 결과

Sum of the row 0: 10
Sum of the row 1: 34
Sum of the row 2: 58
Sum of the row 3: 82
Sum of the column 0: 40
Sum of the column 1: 44
Sum of the column 2: 48
Sum of the column 3: 52

코드 동작 원리 상세 설명

1. 행렬 초기화

main() 함수에서는 1부터 시작하는 연속된 정수 값으로 7×6 크기의 배열을 채웁니다. 첫 번째 행에는 1~6, 두 번째 행에는 7~12처럼 순차적으로 값이 저장됩니다.

2. 행 합계 함수(calc_rsum)

arr[i][j] 형태로 접근하기 때문에 행 i가 고정된 상태에서 열 j가 이동하며 값을 누적합니다. 한 행의 처리가 끝나면 결과를 출력하고 sum을 0으로 되돌려 다음 행의 합계에 영향을 주지 않도록 합니다.

3. 열 합계 함수(calc_csum)

핵심은 arr[j][i]처럼 인덱스 순서를 뒤바꾸는 부분입니다. 열 i를 고정한 채 행 j를 따라 내려가며 값을 더하므로, 같은 반복문 구조로 열 단위 합계를 얻을 수 있습니다.

시간 복잡도

N×M 행렬의 경우, 행 합계와 열 합계를 모두 구하는 데 필요한 시간 복잡도는 O(N×M)입니다. 행렬의 모든 요소를 정확히 한 번씩만 방문하면 되기 때문에 매우 효율적인 방식입니다.

마무리

이처럼 이중 반복문과 인덱스 교환 기법만 익히면, 행렬의 행·열 합계는 물론 전치 행렬, 대각선 합계 등 다양한 2차원 배열 문제에도 같은 원리를 응용할 수 있습니다. 실습을 통해 직접 코드를 변형해 보면서 개념을 확실히 다져 보시기 바랍니다.