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

C++로 행렬의 두 대각선 합 차이 구하기

이 글에서는 주어진 행렬에서 두 대각선의 합 사이의 차이를 구하는 방법을 알아보겠습니다. N x N 크기의 정방행렬이 있을 때, 주 대각선(왼쪽 위 → 오른쪽 아래)과 부 대각선(오른쪽 위 → 왼쪽 아래)의 각 합을 계산한 후, 두 값의 차이(절댓값)를 구하면 됩니다.

대각선 요소에 접근하는 방법

주 대각선(primary diagonal)의 경우, 행 인덱스와 열 인덱스가 동시에 증가합니다. 따라서 matrix[i][i] 형태로 간단하게 접근할 수 있습니다.

반면 부 대각선(secondary diagonal)은 다음 공식을 이용해 접근합니다.

row_index = n - 1 - col_index

즉, 반복문에서 i번째 행에 대해 matrix[i][n-i-1] 요소를 더해주면 부 대각선의 합을 구할 수 있습니다. 두 합을 모두 구한 뒤 차이의 절댓값을 반환하면 최종 결과를 얻을 수 있습니다.

예제 코드

#include<iostream>
#include<cmath>
#define MAX 100
using namespace std;

int diagonalSumDifference(int matrix[][MAX], int n) {
    int sum1 = 0, sum2 = 0;
    for (int i = 0; i < n; i++) {
        sum1 += matrix[i][i];       // 주 대각선의 합
        sum2 += matrix[i][n-i-1];  // 부 대각선의 합
    }
    return abs(sum1 - sum2);
}

// 실행 프로그램
int main() {
    int n = 3;
    int matrix[][MAX] = {
        {11, 2, 4},
        {4 , 5, 6},
        {10, 8, -12}
    };
    cout << "두 대각선 합의 차이: " << diagonalSumDifference(matrix, n);
}

출력 결과

두 대각선 합의 차이: 15

동작 원리 살펴보기

위 예제 행렬을 기준으로 직접 계산해 보면 다음과 같습니다.

  • 주 대각선의 합: 11 + 5 + (-12) = 4
  • 부 대각선의 합: 4 + 5 + 10 = 19
  • 차이: |4 − 19| = 15

이 알고리즘은 행렬을 한 번만 순회하므로 시간 복잡도는 O(n)이며, 추가적인 저장 공간 없이 두 개의 변수만 사용하므로 공간 복잡도는 O(1)입니다. 매우 효율적인 방식으로 대각선 합의 차이를 구할 수 있습니다.