n×n 크기의 행렬이 주어졌을 때, 이 행렬을 하삼각 행렬(Lower Triangular Matrix) 형태로 변환하여 출력하는 것이 이번 글의 목표입니다.
하삼각 행렬이란?
하삼각 행렬은 주대각선(principal diagonal)과 그 아래에 위치한 원소들은 그대로 유지하고, 주대각선 위쪽의 나머지 원소들은 모두 0으로 설정한 행렬을 의미합니다.
다음 그림을 통해 개념을 쉽게 이해할 수 있습니다.

위 그림에서 초록색 원소는 주대각선 아래에 있어 그대로 유지되는 값들이고, 빨간색 원소는 주대각선 위에 있어 0으로 바뀌는 값들입니다.
예제
입력: matrix[3][3] = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 } }
출력:
1 0 0
4 5 0
7 8 9알고리즘
핵심 아이디어는 간단합니다. 행 인덱스 i와 열 인덱스 j를 비교하여, i < j인 경우(주대각선 위쪽)에는 0을 출력하고, 그렇지 않으면 원래 행렬의 값을 그대로 출력하면 됩니다.
int lower_mat(int mat[n][m])
START
STEP 1: 변수 i와 j 선언
STEP 2: FOR i = 0 ~ i < n 반복
FOR j = 0 ~ j < m 반복
IF i < j THEN,
"0\t" 출력
ELSE
mat[i][j] 출력
END IF
END FOR
줄바꿈 출력
END FOR
STOPC 언어 구현 코드
#include <stdio.h>
#define n 3
#define m 3
int lower_mat(int mat[n][m]){
int i, j;
for ( i = 0; i < n; i++){
for ( j = 0; j < m; j++){
if( i < j )
printf("0\t");
else
printf("%d\t", mat[i][j]);
}
printf("\n");
}
}
int main(int argc, char const *argv[]){
int mat[n][m] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
lower_mat(mat);
return 0;
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
1 0 0 4 5 0 7 8 9
시간 복잡도
이 알고리즘은 행렬의 모든 원소를 한 번씩만 방문하면 되므로 시간 복잡도는 O(n²)이며, 추가적인 메모리 없이 기존 행렬을 그대로 활용하기 때문에 공간 복잡도는 O(1)입니다.