이 글에서는 동일한 하나의 행렬을 행 우선(row-major) 순서와 열 우선(column-major) 순서로 각각 배치한 뒤, 이 둘을 더해서 새롭게 형성되는 행렬의 대각합(trace)을 C++로 구하는 방법을 알아봅니다.
문제 정의
두 개의 배열이 주어집니다. 하나는 행 우선 순서로 채워진 행렬이고, 다른 하나는 열 우선 순서로 채워진 행렬입니다. 우리가 해야 할 일은 이 두 행렬을 더해 만들어진 새로운 행렬의 대각합을 계산하는 것입니다.
여기서 대각합(trace)이란 정방 행렬의 주대각선(i == j)에 위치한 원소들의 합을 의미합니다. 즉, 행렬 C의 대각합은 C[0][0] + C[1][1] + … + C[n-1][n-1] 입니다.
- 행 우선(row-major) 순서: 한 행을 왼쪽에서 오른쪽으로 채운 뒤 다음 행으로 내려가는 방식입니다.
- 열 우선(column-major) 순서: 한 열을 위에서 아래로 채운 뒤 다음 열로 이동하는 방식입니다.
예제 코드
#include <bits/stdc++.h>
using namespace std;
// 새로운 행렬의 대각합을 계산하는 함수
int calculateMatrixTrace(int row, int column) {
int A[row][column], B[row][column], C[row][column];
int count = 1;
// A 행렬: 행 우선 순서로 값 채우기
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++) {
A[i][j] = count;
count++;
}
// B 행렬: 열 우선 순서로 값 채우기
count = 1;
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++) {
B[j][i] = count;
count++;
}
// 두 행렬의 합 계산
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++)
C[i][j] = A[i][j] + B[i][j];
// 대각선 원소의 합(대각합) 구하기
int sum = 0;
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++)
if (i == j)
sum += C[i][j];
return sum;
}
int main() {
int ROW = 6, COLUMN = 9;
cout << calculateMatrixTrace(ROW, COLUMN) << endl;
return 0;
}
실행 결과
384
코드 동작 원리
- A 행렬 생성(행 우선): count를 1부터 시작하여 각 행을 따라 왼쪽에서 오른쪽으로 값을 채워 나갑니다.
- B 행렬 생성(열 우선): B[j][i] 위치에 값을 저장함으로써 열을 따라 위에서 아래로 값이 채워지도록 합니다.
- 두 행렬의 합: C[i][j] = A[i][j] + B[i][j] 식으로 같은 위치의 원소들을 더해 새로운 행렬 C를 만듭니다.
- 대각합 계산: 행 인덱스와 열 인덱스가 같은(i == j) 원소만 골라 모두 더한 뒤 결과를 반환합니다.
참고 사항
실무 환경에서는 가변 길이 배열(VLA)이 C++ 표준에 포함되어 있지 않으므로, std::vector<std::vector<int>>를 사용하는 것이 안전합니다. 또한 행과 열의 크기가 다른 비정방 행렬을 다룰 때는 인덱스가 배열의 범위를 벗어나지 않도록 항상 주의해야 합니다.