이 글에서는 주어진 행렬에서 두 대각선의 합 사이의 차이를 구하는 방법을 알아보겠습니다. 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)입니다. 매우 효율적인 방식으로 대각선 합의 차이를 구할 수 있습니다.