프로그램 설명
이 글에서는 배열(2차원 행렬)의 하삼각 행렬과 상삼각 행렬을 출력하는 C 프로그램을 작성하는 방법을 알아봅니다.
삼각 행렬(Triangular Matrix)이란?
삼각 행렬은 하삼각 행렬 또는 상삼각 행렬 중 하나에 해당하는 행렬을 의미합니다.
하삼각 행렬(Lower Triangular Matrix)
정사각형 행렬에서 주대각선 위쪽의 모든 원소가 0일 때, 이 행렬을 하삼각 행렬이라고 부릅니다.
상삼각 행렬(Upper Triangular Matrix)
반대로, 정사각형 행렬에서 주대각선 아래쪽의 모든 원소가 0일 때, 이 행렬을 상삼각 행렬이라고 부릅니다.
다음과 같은 형태의 행렬을 하삼각 행렬(또는 좌삼각 행렬)이라 하며,
$${\displaystyle L={\begin{bmatrix}\ell _{1,1}&&&&0\\\ell _{2,1}&\ell _{2,2}&&&\\\ell _{3,1}&\ell _{3,2}&\ddots &&\\\vdots &\vdots &\ddots &\ddots &\\\ell _{n,1}&\ell _{n,2}&\ldots &\ell _{n,n-1}&\ell _{n,n}\end{bmatrix}}}$$
다음과 같은 형태의 행렬을 상삼각 행렬(또는 우삼각 행렬)이라고 합니다.
$${\displaystyle U={\begin{bmatrix}u_{1,1}&u_{1,2}&u_{1,3}&\ldots &u_{1,n}\\&u_{2,2}&u_{2,3}&\ldots &u_{2,n}\\&&\ddots &\ddots &\vdots \\&&&\ddots &u_{n-1,n}\\0&&&&u_{n,n}\end{bmatrix}}}$$
일반적으로 하삼각 행렬은 변수 L로, 상삼각 행렬은 변수 U 또는 R로 표기합니다.
참고로, 상삼각 행렬이면서 동시에 하삼각 행렬인 행렬은 대각 행렬(diagonal matrix)입니다. 또한 삼각 행렬과 닮은(similar) 행렬을 삼각화 가능(triangularisable) 행렬이라고 부릅니다.
예시 — 상삼각 행렬
$${\displaystyle {\begin{bmatrix}{1}&{4}&{1}\\{0}&{6}&{4}\\{0}&{0}&{1}\end{bmatrix}}}$$
예시 — 하삼각 행렬
$${\displaystyle {\begin{bmatrix}{1}&{0}&{0}\\{2}&{8}&{0}\\{4}&{9}&{7}\end{bmatrix}}}$$
알고리즘
예시 — 다양한 크기의 행렬


하삼각 행렬을 만드는 방법
- 행(row)과 열(column)의 인덱스 위치를 확인합니다.
- 열 위치가 행 위치보다 크면(즉, 주대각선 위쪽이면) 해당 위치의 값을 0으로 만듭니다.
상삼각 행렬을 만드는 방법
- 행과 열의 인덱스 위치를 확인합니다.
- 열 위치가 행 위치보다 작으면(즉, 주대각선 아래쪽이면) 해당 위치의 값을 0으로 만듭니다.

예제 코드
/* 하삼각 행렬과 상삼각 행렬을 구하는 프로그램 */
#include<stdio.h>
int main() {
int rows, cols, r, c, matrix[10][10];
clrscr(); /* 화면 지우기 */
printf("Please enter the number of rows for the matrix: ");
scanf("%d", &rows);
printf("\n");
printf("Please enter the number of columns for the matrix: ");
scanf("%d", &cols);
printf("\n");
printf("Please enter the elements for the Matrix: \n");
for(r = 0; r < rows; r++){
for(c = 0;c < cols;c++){
scanf("%d", &matrix[r][c]);
}
}
printf("\n The Lower Triangular Matrix is: ");
for(r = 0; r < rows; r++){
printf("\n");
for(c = 0; c < cols; c++){
if(r >= c){
printf("%d\t ", matrix[r][c]);
}
else{
printf("0");
printf("\t");
}
}
}
printf("\n\n The Upper Triangular Matrix is: ");
for(r = 0; r < rows; r++){
printf("\n");
for(c = 0; c < cols; c++){
if(r > c){
printf("0");
printf("\t");
}
else{
printf("%d\t ", matrix[r][c]);
}
}
}
getch();
return 0;
}참고: 위 코드의 clrscr()과 getch() 함수는 Turbo C 계열 컴파일러에서만 제공되는 함수입니다. GCC나 Visual Studio 등 최신 컴파일러 환경에서 실행할 경우 이 두 줄을 삭제하고, 대신 #include<conio.h> 관련 호출을 제거한 뒤 표준 입출력만 사용하면 됩니다.
핵심 로직 요약
- 하삼각 행렬: 행 인덱스(r)가 열 인덱스(c)보다 크거나 같으면 원래 값을 출력하고, 그렇지 않으면 0을 출력합니다.
- 상삼각 행렬: 행 인덱스(r)가 열 인덱스(c)보다 크면 0을 출력하고, 그렇지 않으면 원래 값을 출력합니다.
실행 결과
