Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어로 행렬의 행은 오름차순, 열은 내림차순으로 정렬하는 방법

C 프로그래밍에서 2차원 배열(행렬)을 다루다 보면 행과 열을 서로 다른 기준으로 정렬해야 하는 경우가 종종 있습니다. 이 글에서는 사용자로부터 행렬의 크기와 원소를 입력받아, 모든 행을 오름차순으로 정렬하고 모든 열을 내림차순으로 정렬하는 C 프로그램을 단계별로 살펴보겠습니다.

문제 정의

프로그램 실행 시점에 사용자로부터 행렬의 차수(행의 개수 m, 열의 개수 n)와 행렬의 원소들을 입력받은 뒤, 아래 조건에 맞게 정렬하는 것이 목표입니다.

  • 행(Row) 정렬: 각 행의 원소를 왼쪽에서 오른쪽으로 오름차순(작은 값 → 큰 값)으로 배치
  • 열(Column) 정렬: 각 열의 원소를 위에서 아래로 내림차순(큰 값 → 작은 값)으로 배치

해결 방법

이 문제는 선택 정렬(selection sort)과 유사한 방식으로, 반복문 안에서 원소들을 비교하고 필요하면 교환(swap)하는 기법으로 손쉽게 해결할 수 있습니다. 전체적인 흐름은 다음과 같습니다.

  1. 입력받은 행렬을 두 개의 배열 ma, mb에 각각 저장합니다.
  2. 배열 ma를 이용해 각 행을 오름차순으로 정렬합니다.
  3. 배열 mb를 이용해 각 열을 내림차순으로 정렬합니다.
  4. 정렬 전후의 행렬을 화면에 출력합니다.

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

실행 결과를 보면 먼저 각 행이 오름차순으로 정렬된 뒤, 이어서 열 단위로 내림차순 정렬이 적용된 것을 확인할 수 있습니다. 반복문의 인덱스 순서만 바꾸면 행 단위 정렬과 열 단위 정렬을 모두 구현할 수 있다는 점이 이 예제의 핵심입니다.