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

C++로 행렬이 대칭 행렬인지 확인하는 프로그램

선형대수학에서 행렬 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 크기의 정방 행렬에 적용할 수 있습니다.