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

C++로 3×3 마방진 완성하기: 행·열·대각선의 합이 같아지도록 빈 대각선 채우기


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

예를 들어 다음과 같은 행렬이 입력으로 주어졌다고 합시다.

C++로 3×3 마방진 완성하기: 행·열·대각선의 합이 같아지도록 빈 대각선 채우기

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

C++로 3×3 마방진 완성하기: 행·열·대각선의 합이 같아지도록 빈 대각선 채우기

풀이 접근 방식

비어 있는 대각선 요소를 각각 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 등으로 변경하여 처리하는 것이 좋습니다.