프로그래밍 학습에서 행렬(matrix) 문제는 빠질 수 없는 주제입니다. 이 글에서는 주어진 행렬의 경계(테두리) 요소를 출력하고, 해당 요소들의 합을 계산하는 C 프로그램 작성 방법을 예제와 함께 자세히 알아보겠습니다.
문제 이해하기
행렬의 경계 요소란 첫 번째 행, 마지막 행, 첫 번째 열, 마지막 열에 위치한 모든 요소를 의미합니다. 즉, 행렬의 가장자리에 있는 값들이 경계 요소가 됩니다. 아래 예제를 통해 쉽게 이해할 수 있습니다.
예제 행렬
1 2 3 4 5 6 7 8 9
경계 행렬
1 2 3 4 6 7 8 9
위 3×3 행렬에서 내부에 있는 값인 5를 제외한 나머지 요소가 모두 경계 요소입니다.
경계 요소의 합: 1 + 2 + 3 + 4 + 6 + 7 + 8 + 9 = 40
핵심 로직
경계 요소를 판별하는 핵심은 간단합니다. 이중 반복문으로 행렬의 모든 요소를 순회하면서, 현재 위치가 다음 네 가지 조건 중 하나라도 만족하면 경계 요소로 판단합니다.
- i == 0 → 첫 번째 행
- i == m-1 → 마지막 행
- j == 0 → 첫 번째 열
- j == n-1 → 마지막 열
조건을 만족하는 요소는 화면에 출력하고 합계 변수에 더하며, 그렇지 않은 내부 요소는 공백으로 대체하여 출력합니다.
for(i = 0; i<m; i++){
for(j = 0; j<n; j++){
if (i == 0 || j == 0 || i == m - 1 || j == n - 1){
printf("%d ", mat[i][j]);
sum = sum + mat[i][j];
}
else
printf(" ");
}
printf("\n");
}
C 프로그램 전체 코드
다음은 행렬의 경계 요소를 출력하고 그 합을 계산하는 완전한 C 프로그램입니다.
#include<stdio.h>
int main(){
int m, n, sum = 0;
printf("\nEnter the order of the matrix : ");
scanf("%d %d",&m,&n);
int i, j;
int mat[m][n];
printf("\nInput the matrix elements\n");
for(i = 0; i<m; i++){
for(j = 0; j<n; j++)
scanf("%d",&mat[i][j]);
}
printf("\nBoundary Matrix\n");
for(i = 0; i<m; i++){
for(j = 0; j<n; j++){
if (i == 0 || j == 0 || i == m - 1 || j == n - 1){
printf("%d ", mat[i][j]);
sum = sum + mat[i][j];
}
else
printf(" ");
}
printf("\n");
}
printf("\nSum of boundary is %d", sum);
return 0;
}
실행 결과
위 프로그램을 컴파일 후 실행하면 다음과 같은 결과가 출력됩니다.
Enter the order of the matrix : 3 3 Input the matrix elements : 1 2 3 4 5 6 7 8 9 Boundary Matrix : 1 2 3 4 6 7 8 9 Sum of boundary is 40
코드 동작 원리 정리
프로그램의 흐름을 단계별로 살펴보면 다음과 같습니다.
- 사용자로부터 행렬의 크기(m×n)를 입력받습니다.
- 가변 길이 배열(VLA)을 선언하고, 이중 반복문을 통해 행렬 요소를 입력받아 저장합니다.
- 다시 이중 반복문으로 모든 요소를 순회하며 경계 여부를 검사합니다.
- 경계 요소라면 값을 출력하고
sum에 누적하며, 내부 요소라면 공백을 출력해 경계 행렬 형태를 만듭니다. - 모든 순회가 끝나면 최종 합계를 출력합니다.
이 알고리즘의 시간 복잡도는 행렬의 모든 요소를 한 번씩만 확인하므로 O(m×n)이며, 추가 메모리 없이 기존 배열만 사용하므로 공간 복잡도는 O(1)입니다. 참고로, 정방 행렬(n×n)뿐 아니라 직사각형 행렬에서도 올바른 결과를 얻으려면 마지막 행 조건을 i == m - 1로, 마지막 열 조건을 j == n - 1로 작성해야 한다는 점에 유의하세요.