3×3 크기의 행렬이 하나 주어져 있고, 대각선 요소는 아직 비어 있다고 가정해 보겠습니다. 우리가 해야 할 일은 이 빈 대각선 자리를 적절한 값으로 채워서 모든 행, 열, 대각선의 합이 서로 같아지도록 만드는 것입니다. 이렇게 완성된 행렬은 흔히 '마방진(Magic Square)'이라고 불립니다.
예를 들어 다음과 같은 행렬이 입력으로 주어졌다고 합시다.

대각선을 모두 채우고 나면 결과는 다음과 같습니다.

풀이 접근 방식
비어 있는 대각선 요소를 각각 x, y, z라고 두겠습니다. 여기서 x는 좌상단 M[1,1], y는 중앙 M[2,2], z는 우하단 M[3,3]에 해당합니다. 행렬의 합 성질을 이용하면 세 값은 다음과 같은 공식으로 간단히 구할 수 있습니다.
- x = (M[2,3] + M[3,2]) / 2
- z = (M[1,2] + M[2,1]) / 2
- y = (x + z) / 2
즉, x와 z는 각각 마주 보는 위치의 인접 요소 두 개의 평균으로 계산되고, 중앙값 y는 x와 z의 평균이 됩니다. 전체 요소의 합이 목표 합의 3배라는 사실과 각 행·열·대각선의 합이 모두 같다는 조건을 연립하면 위 공식이 자연스럽게 도출됩니다.
C++ 구현 예제
#include<iostream>
using namespace std;
void displayMatrix(int matrix[3][3]) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
cout << matrix[i][j] << " ";
cout << endl;
}
}
void fillDiagonal(int matrix[3][3]) {
matrix[0][0] = (matrix[1][2] + matrix[2][1]) / 2;
matrix[2][2] = (matrix[0][1] + matrix[1][0]) / 2;
matrix[1][1] = (matrix[0][0] + matrix[2][2]) / 2;
cout << "완성된 행렬" << endl;
displayMatrix(matrix);
}
int main() {
int matrix[3][3] = {
{ 0, 3, 6 },
{ 5, 0, 5 },
{ 4, 7, 0 }};
cout << "주어진 행렬" << endl;
displayMatrix(matrix);
fillDiagonal(matrix);
}
실행 결과
주어진 행렬 0 3 6 5 0 5 4 7 0 완성된 행렬 6 3 6 5 5 5 4 7 4
결과 분석 및 참고 사항
예제 행렬에 공식을 적용하면 x = (5 + 7) / 2 = 6, z = (3 + 5) / 2 = 4, y = (6 + 4) / 2 = 5가 됩니다. 완성된 행렬을 확인해 보면 첫 번째 행의 합(6+3+6), 두 번째 행의 합(5+5+5), 세 번째 행의 합(4+7+4)은 물론, 세 개의 열과 두 개의 대각선까지 모두 15로 동일한 것을 알 수 있습니다.
한 가지 주의할 점은 위 코드가 정수 나눗셈(/)을 사용한다는 것입니다. 따라서 계산 과정에서 홀수가 나누어질 경우 소수점 이하는 버려집니다. 실수 값을 정확하게 유지해야 하는 상황이라면 자료형을 double 등으로 변경하여 처리하는 것이 좋습니다.