문제 개요
이번 글에서는 정사각행렬의 주대각선(왼쪽 위 → 오른쪽 아래) 요소와 부대각선(오른쪽 위 → 왼쪽 아래) 요소를 서로 교환하는 C 프로그램을 작성해 보겠습니다.
행렬의 크기(m×n)는 프로그램 실행 시 사용자로부터 직접 입력받습니다. 만약 입력된 행과 열의 값이 서로 다르다면 해당 행렬은 정사각행렬이 아니므로, "정사각행렬이 아닙니다"라는 메시지를 출력하도록 처리합니다.
주대각선과 부대각선의 교환은 오직 정사각행렬(n×n)에서만 가능하다는 점을 기억하세요.
해결 방법
주어진 행렬의 대각선 요소를 교환하는 C 프로그램의 핵심 아이디어는 다음과 같습니다.
i번째 행에서 주대각선 요소는 ma[i][i], 부대각선 요소는 ma[i][m-i-1]에 위치합니다. 따라서 임시 변수를 이용해 두 값을 맞바꾸면 됩니다.
for (i = 0; i < m; ++i) {
a = ma[i][i]; // 주대각선 요소 임시 저장
ma[i][i] = ma[i][m-i-1]; // 부대각선 요소를 주대각선 위치에 저장
ma[i][m-i-1] = a; // 임시 저장한 값을 부대각선 위치에 저장
}전체 소스 코드
다음은 행렬의 대각선 요소를 교환하는 전체 C 프로그램입니다.
#include<stdio.h>
main() {
int i, j, m, n, a;
static int ma[10][10];
printf("Enter the order of the matrix m and n\n");
scanf("%dx%d", &m, &n);
if (m == n) {
printf("Enter the co-efficients of the matrix\n");
for (i = 0; i < m; ++i) {
for (j = 0; j < n; ++j) {
scanf("%d", &ma[i][j]);
}
}
printf("The given matrix is \n");
for (i = 0; i < m; ++i) {
for (j = 0; j < n; ++j) {
printf(" %d", ma[i][j]);
}
printf("\n");
}
// 주대각선과 부대각선 요소 교환
for (i = 0; i < m; ++i) {
a = ma[i][i];
ma[i][i] = ma[i][m-i-1];
ma[i][m-i-1] = a;
}
printf("Matrix after changing the \n");
printf("Main & secondary diagonal\n");
for (i = 0; i < m; ++i) {
for (j = 0; j < n; ++j) {
printf(" %d", ma[i][j]);
}
printf("\n");
}
}
else
printf("The given order is not square matrix\n");
}실행 결과
위 프로그램을 컴파일하고 실행하면 다음과 같은 결과를 확인할 수 있습니다.
Run 1: Enter the order of the matrix m and n 3x3 Enter the co-efficient of the matrix 1 2 3 4 5 6 7 8 9 The given matrix is 1 2 3 4 5 6 7 8 9 Matrix after changing the Main & secondary diagonal 3 2 1 4 5 6 9 8 7 Run 2: Enter the order of the matrix m and n 4x3 The given order is not square matrix
동작 원리 정리
첫 번째 실행 예시(3×3 행렬)를 보면, 원래 행렬에서 1↔3, 5↔5, 7↔9가 서로 교환되어 결과 행렬이 만들어졌습니다. 가운데 요소인 5는 주대각선과 부대각선이 만나는 지점이므로 그대로 유지됩니다.
두 번째 실행 예시처럼 4×3처럼 행과 열의 크기가 다른 경우에는 정사각행렬이 아니므로 교환 작업 없이 안내 메시지만 출력되고 종료됩니다.
이 프로그램의 시간 복잡도는 O(n)으로, 단 한 번의 반복문만으로 모든 대각선 요소를 교환할 수 있어 매우 효율적입니다.