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

C++로 대각행렬과 스칼라행렬 판별하기: 개념부터 구현까지


행렬 M[r][c]가 주어졌을 때, r은 행(row)의 개수, c는 열(column)의 개수를 나타냅니다. 이때 r = c이면 정사각 행렬(square matrix)이 됩니다. 이 글에서는 주어진 정사각 행렬이 대각행렬(diagonal matrix) 또는 스칼라행렬(scalar matrix)인지 판별하고, 조건을 만족하면 결과를 출력하는 프로그램을 만들어 보겠습니다.

대각행렬(Diagonal Matrix)이란?

정사각 행렬 m[][]이 대각행렬이 되려면, 주대각선(main diagonal)을 제외한 모든 원소가 0이어야 합니다.

아래 그림과 같습니다.

C++로 대각행렬과 스칼라행렬 판별하기: 개념부터 구현까지

빨간색으로 표시된 원소들이 주대각선에 해당하며 0이 아닌 값을 가지고, 나머지 원소는 모두 0입니다. 이러한 행렬이 바로 대각행렬입니다.

예제

입력: m[3][3] = { {7, 0, 0},
    {0, 8, 0},
    {0, 0, 9}}
출력: yes
입력: m[3][3] = { {1, 2, 3},
    {0, 4, 0},
    {0, 0, 5}
}
출력: no

첫 번째 행렬은 주대각선 외의 원소가 모두 0이므로 대각행렬입니다. 반면 두 번째 행렬은 arr[0][1] = 2, arr[0][2] = 3처럼 주대각선이 아닌 위치에 0이 아닌 값이 존재하기 때문에 대각행렬이 아닙니다.

알고리즘

시작
Step 1 -> 크기 4의 매크로(size) 정의
Step 2 -> 행렬이 대각행렬인지 검사하는 함수 선언
    bool ifdiagonal(int arr[size][size])
        int i = 0; i < size; i++ 반복
            int j = 0; j < size; j++ 반복
                IF ((i != j) && (arr[i][j] != 0))
                    return false
                End
            End
        End
    return true
Step 3 -> main() 함수에서
    배열 선언 및 초기화: int arr[size][size] = { { 1, 0, 0, 0 },
        { 0, 1, 0, 0 },
        { 0, 0, 1, 0 },
        { 0, 0, 0, 1 }
    };
    IF (ifdiagonal(arr))
        "대각행렬입니다" 출력
    Else
        "대각행렬이 아닙니다" 출력
    End
종료

C++ 구현 - 대각행렬 판별

#include <bits/stdc++.h>
#define size 4
using namespace std;
// 행렬이 대각행렬인지 검사하는 함수
bool ifdiagonal(int arr[size][size]){
    for (int i = 0; i < size; i++)
    for (int j = 0; j < size; j++)

    if ((i != j) && (arr[i][j] != 0))
       return false;
       return true;
}
int main(){
    int arr[size][size] = { { 1, 0, 0, 0 },
       { 0, 1, 0, 0 },
       { 0, 0, 1, 0 },
       { 0, 0, 0, 1 }
    };
    if (ifdiagonal(arr))
       cout << "its a diagonal matrix" << endl;
    else
       cout << "its not a diagonal matrix" << endl;
    return 0;
}

실행 결과

its a diagonal matrix

스칼라행렬(Scalar Matrix)이란?

정사각 행렬 m[][]이 스칼라행렬이 되려면, 주대각선의 원소들이 서로 같은 값을 가져야 하고 나머지 원소들은 모두 0이어야 합니다. 즉, 스칼라행렬은 대각행렬의 특수한 형태라고 할 수 있습니다.

아래 예시를 살펴보겠습니다.

C++로 대각행렬과 스칼라행렬 판별하기: 개념부터 구현까지

빨간색으로 표시된 주대각선 원소들이 모두 같은 값을 가지고, 나머지 원소는 0이므로 이 행렬은 스칼라행렬입니다.

예제

입력: m[3][3] = { {2, 0, 0},
    {0, 2, 0},
    {0, 0, 2} }
출력: yes
입력: m[3][3] = { {3, 0, 0},
    {0, 2, 0},
    {0, 0, 3} }
출력: no

첫 번째 행렬은 주대각선 원소가 모두 2로 동일하므로 스칼라행렬입니다. 두 번째 행렬은 주대각선 원소가 3, 2, 3으로 서로 다르기 때문에 스칼라행렬이 아닙니다.

알고리즘

시작
Step 1 -> 매크로 선언: #define size 4
Step 2 -> 행렬이 스칼라행렬인지 검사하는 함수 선언
    bool scalar(int arr[size][size])
        int i = 0; i < size; i++ 반복
            int j = 0; j < size; j++ 반복
                IF ((i != j) && (arr[i][j] != 0))
                    return false
                End
            End
        End
    int i = 0; i < size - 1; i++ 반복
        If (arr[i][i] != arr[i + 1][i + 1])
            return false
        End
    End
    Return true
Step 3 -> main() 함수에서
    배열 선언: int arr[size][size] = { { 2, 0, 0, 0 },
        { 0, 2, 0, 0 },
        { 0, 0, 2, 0 },
        { 0, 0, 0, 2 }
    }
    IF(scalar(arr))
        "스칼라행렬입니다" 출력
    Else
        "스칼라행렬이 아닙니다" 출력
종료

C++ 구현 - 스칼라행렬 판별

#include <bits/stdc++.h>
#define size 4
using namespace std;
// 행렬이 스칼라행렬인지 검사하는 함수
bool scalar(int arr[size][size]){
    for (int i = 0; i < size; i++)
    for (int j = 0; j < size; j++)
       if ((i != j) && (arr[i][j] != 0))
          return false;
    for (int i = 0; i < size - 1; i++)
       if (arr[i][i] != arr[i + 1][i + 1])
          return false;
          return true;
}
int main(){
    int arr[size][size] = { { 2, 0, 0, 0 },
       { 0, 2, 0, 0 },
       { 0, 0, 2, 0 },
       { 0, 0, 0, 2 } };
    if (scalar(arr))
       cout << "its a scalar matrix" << endl;
    else
       cout << "its not a scalar matrix" << endl;
    return 0;
}

실행 결과

its a scalar matrix

정리

대각행렬은 주대각선 외의 원소가 모두 0인 정사각 행렬이며, 스칼라행렬은 여기서 더 나아가 주대각선 원소까지 모두 같은 값을 가져야 하는 행렬입니다. 두 조건 모두 이중 반복문을 통해 O(n²) 시간 복잡도로 간단히 검사할 수 있습니다. 위 코드를 응용하면 단위행렬(identity matrix) 같은 다른 특수 행렬도 손쉽게 판별할 수 있습니다.