행렬 M[r][c]가 주어졌을 때, r은 행(row)의 개수, c는 열(column)의 개수를 나타냅니다. 이때 r = c이면 정사각 행렬(square matrix)이 됩니다. 이 글에서는 주어진 정사각 행렬이 대각행렬(diagonal matrix) 또는 스칼라행렬(scalar matrix)인지 판별하고, 조건을 만족하면 결과를 출력하는 프로그램을 만들어 보겠습니다.
대각행렬(Diagonal Matrix)이란?
정사각 행렬 m[][]이 대각행렬이 되려면, 주대각선(main diagonal)을 제외한 모든 원소가 0이어야 합니다.
아래 그림과 같습니다.

빨간색으로 표시된 원소들이 주대각선에 해당하며 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이어야 합니다. 즉, 스칼라행렬은 대각행렬의 특수한 형태라고 할 수 있습니다.
아래 예시를 살펴보겠습니다.

빨간색으로 표시된 주대각선 원소들이 모두 같은 값을 가지고, 나머지 원소는 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) 같은 다른 특수 행렬도 손쉽게 판별할 수 있습니다.