C 프로그래밍에서 2차원 배열(행렬)을 다루다 보면 행과 열을 서로 다른 기준으로 정렬해야 하는 경우가 종종 있습니다. 이 글에서는 사용자로부터 행렬의 크기와 원소를 입력받아, 모든 행을 오름차순으로 정렬하고 모든 열을 내림차순으로 정렬하는 C 프로그램을 단계별로 살펴보겠습니다.
문제 정의
프로그램 실행 시점에 사용자로부터 행렬의 차수(행의 개수 m, 열의 개수 n)와 행렬의 원소들을 입력받은 뒤, 아래 조건에 맞게 정렬하는 것이 목표입니다.
- 행(Row) 정렬: 각 행의 원소를 왼쪽에서 오른쪽으로 오름차순(작은 값 → 큰 값)으로 배치
- 열(Column) 정렬: 각 열의 원소를 위에서 아래로 내림차순(큰 값 → 작은 값)으로 배치
해결 방법
이 문제는 선택 정렬(selection sort)과 유사한 방식으로, 반복문 안에서 원소들을 비교하고 필요하면 교환(swap)하는 기법으로 손쉽게 해결할 수 있습니다. 전체적인 흐름은 다음과 같습니다.
- 입력받은 행렬을 두 개의 배열 ma, mb에 각각 저장합니다.
- 배열 ma를 이용해 각 행을 오름차순으로 정렬합니다.
- 배열 mb를 이용해 각 열을 내림차순으로 정렬합니다.
- 정렬 전후의 행렬을 화면에 출력합니다.
1. 행을 오름차순으로 정렬하는 로직
바깥쪽 반복문이 행을 하나씩 순회하고, 안쪽 두 반복문이 같은 행 안의 원소들을 서로 비교하여 더 큰 값을 뒤쪽으로 보내는 방식입니다.
for (i=0;i<m;++i){
for (j=0;j<n;++j){
for (k=(j+1);k<n;++k){
if (ma[i][j] > ma[i][k]){
a = ma[i][j];
ma[i][j] = ma[i][k];
ma[i][k] = a;
}
}
}
}
2. 열을 내림차순으로 정렬하는 로직
이번에는 바깥쪽 반복문이 열을 하나씩 순회하고, 같은 열 안의 원소들을 비교하여 더 작은 값을 아래쪽으로 보냄으로써 내림차순을 만듭니다.
for (j=0;j<n;++j){
for (i=0;i<m;++i){
for (k=i+1;k<m;++k){
if (mb[i][j] < mb[k][j]){
a = mb[i][j];
mb[i][j] = mb[k][j];
mb[k][j] = a;
}
}
}
}
전체 프로그램
다음은 행렬의 모든 행을 오름차순으로, 모든 열을 내림차순으로 정렬하는 완전한 C 프로그램입니다.
#include <stdio.h>
void main(){
int i,j,k,a,m,n;
static int ma[10][10],mb[10][10];
printf ("Enter the order of the matrix \n");
scanf ("%d %d", &m,&n);
printf ("Enter co-efficients of the matrix \n");
for (i=0;i<m;++i){
for (j=0;j<n;++j){
scanf ("%d",&ma[i][j]);
mb[i][j] = ma[i][j];
}
}
printf ("The given matrix is \n");
for (i=0;i<m;++i){
for (j=0;j<n;++j){
printf (" %d",ma[i][j]);
}
printf ("\n");
}
printf ("After arranging rows in ascending order\n");
for (i=0;i<m;++i){
for (j=0;j<n;++j){
for (k=(j+1);k<n;++k){
if (ma[i][j] > ma[i][k]){
a = ma[i][j];
ma[i][j] = ma[i][k];
ma[i][k] = a;
}
}
}
}
for (i=0;i<m;++i){
for (j=0;j<n;++j){
printf (" %d",ma[i][j]);
}
printf ("\n");
}
printf ("After arranging the columns in descending order \n");
for (j=0;j<n;++j){
for (i=0;i<m;++i){
for (k=i+1;k<m;++k){
if (mb[i][j] < mb[k][j]){
a = mb[i][j];
mb[i][j] = mb[k][j];
mb[k][j] = a;
}
}
}
}
for (i=0;i<m;++i){
for (j=0;j<n;++j){
printf (" %d",mb[i][j]);
}
printf ("\n");
}
}
실행 결과
위 프로그램을 컴파일하여 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Enter the order of the matrix 3 4 Enter co-efficient of the matrix 1 2 3 4 1 2 3 4 5 1 2 3 The given matrix is 1 2 3 4 1 2 3 4 5 1 2 3 After arranging rows in ascending order 1 2 3 4 1 2 3 4 1 2 3 5 After arranging the columns in descending order 5 2 3 4 1 2 3 4 1 1 2 3
실행 결과를 보면 먼저 각 행이 오름차순으로 정렬된 뒤, 이어서 열 단위로 내림차순 정렬이 적용된 것을 확인할 수 있습니다. 반복문의 인덱스 순서만 바꾸면 행 단위 정렬과 열 단위 정렬을 모두 구현할 수 있다는 점이 이 예제의 핵심입니다.