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

C++에서 동일한 행렬의 행 우선·열 우선 순서를 더해 만든 행렬의 대각합(Trace) 구하기

이 글에서는 동일한 하나의 행렬을 행 우선(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

코드 동작 원리

  1. A 행렬 생성(행 우선): count를 1부터 시작하여 각 행을 따라 왼쪽에서 오른쪽으로 값을 채워 나갑니다.
  2. B 행렬 생성(열 우선): B[j][i] 위치에 값을 저장함으로써 열을 따라 위에서 아래로 값이 채워지도록 합니다.
  3. 두 행렬의 합: C[i][j] = A[i][j] + B[i][j] 식으로 같은 위치의 원소들을 더해 새로운 행렬 C를 만듭니다.
  4. 대각합 계산: 행 인덱스와 열 인덱스가 같은(i == j) 원소만 골라 모두 더한 뒤 결과를 반환합니다.

참고 사항

실무 환경에서는 가변 길이 배열(VLA)이 C++ 표준에 포함되어 있지 않으므로, std::vector<std::vector<int>>를 사용하는 것이 안전합니다. 또한 행과 열의 크기가 다른 비정방 행렬을 다룰 때는 인덱스가 배열의 범위를 벗어나지 않도록 항상 주의해야 합니다.