선형대수학에서 행렬 M[][]의 전치행렬(transpose)이 원래 행렬 자신과 같을 때, 그 행렬을 대칭 행렬(symmetric matrix)이라고 합니다. 전치행렬이란 행렬을 주대각선을 기준으로 뒤집어서 행과 열의 인덱스를 서로 바꾼 행렬을 의미합니다.
대칭 행렬의 예
아래는 대칭 행렬의 예시입니다.
$$\begin{bmatrix} 1 & 4 & 7 \\ 4 & 5 & 6 \\ 7 & 6 & 9 \end{bmatrix} \Rightarrow \begin{bmatrix} 1 & 4 & 7 \\ 4 & 5 & 6 \\ 7 & 6 & 9 \end{bmatrix}$$
위 행렬은 왼쪽 행렬을 전치해도 결과가 원래 행렬과 동일하므로 대칭 행렬입니다.
입력 및 출력 예시
입력: arr1[][n] = { { 1, 2, 3 },
{ 2, 2, 4 },
{ 3, 4, 1 } };
출력: 대칭 행렬입니다
입력: arr1[][n] = { { 1, 7, 3 },
{ 2, 9, 5 },
{ 4, 6, 8 } };
출력: 대칭 행렬이 아닙니다접근 방법
다음 단계를 따르면 됩니다.
- 1. 주어진 행렬의 전치행렬을 구하여 다른 행렬에 저장합니다.
- 2. 전치행렬이 원래 입력 행렬과 같은지 비교합니다.
알고리즘
시작
단계 1 -> 매크로 정의: #define n 10
단계 2 -> 행렬의 전치를 구하는 함수 선언
void transpose(int arr1[][n], int arr2[][n], int a)
반복문 For int i = 0, i < a, i++
반복문 For int j = 0, j < a, j++
arr2[i][j] = arr1[j][i] 설정
End
End
단계 3 -> 대칭 여부를 확인하는 함수 선언
bool check(int arr1[][n], int a)
변수 int arr2[a][n] 선언
transpose(arr1, arr2, a) 호출
반복문 For int i = 0, i < a, i++
반복문 For int j = 0, j < a, j++
IF (arr1[i][j] != arr2[i][j])
return false 반환
End
End
End
true 반환
단계 4 -> main() 함수에서
변수 int arr1[][n] = { { 1, 2, 3 },
{ 2, 2, 4 },
{ 3, 4, 1 } } 선언
IF (check(arr1, 3))
'대칭 행렬입니다' 출력
Else
'대칭 행렬이 아닙니다' 출력
종료
C++ 구현 예제
#include <iostream>
#define n 10
using namespace std;
// 행렬의 전치를 구하는 함수
void transpose(int arr1[][n], int arr2[][n], int a){
for (int i = 0; i < a; i++)
for (int j = 0; j < a; j++)
arr2[i][j] = arr1[j][i];
}
// 대칭 여부를 확인하는 함수
bool check(int arr1[][n], int a){
int arr2[a][n];
transpose(arr1, arr2, a);
for (int i = 0; i < a; i++)
for (int j = 0; j < a; j++)
if (arr1[i][j] != arr2[i][j])
return false;
return true;
}
int main(){
int arr1[][n] = { { 1, 2, 3 },
{ 2, 2, 4 },
{ 3, 4, 1 } };
if (check(arr1, 3))
cout << "대칭 행렬입니다";
else
cout << "대칭 행렬이 아닙니다";
return 0;
}
실행 결과
대칭 행렬입니다
이 프로그램은 먼저 입력 행렬의 전치행렬을 계산한 뒤, 원래 행렬과 요소별로 비교하여 모든 값이 일치하면 대칭 행렬로 판별합니다. 시간 복잡도는 O(n²)이며, n×n 크기의 정방 행렬에 적용할 수 있습니다.