행렬의 행 합과 열 합 계산이란?
이 튜토리얼에서는 주어진 행렬(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차원 배열 문제에도 같은 원리를 응용할 수 있습니다. 실습을 통해 직접 코드를 변형해 보면서 개념을 확실히 다져 보시기 바랍니다.