C 언어로 행렬의 전치 계산하기

CBeginner
지금 연습하기

소개

이 실습에서는 C 언어로 행렬의 전치를 계산하는 방법을 배웁니다. 이 실습은 다음 단계를 포함합니다.

차원 및 요소 읽기: 행렬의 차원 (행과 열) 을 읽고 사용자 입력 값으로 채우는 방법을 배웁니다. 이 단계는 행렬 전치 프로세스의 기반을 설정합니다.

행과 열 바꾸기: 행렬 전치의 핵심은 원래 행렬의 행과 열을 바꿔 전치 행렬을 만드는 것입니다.

전치 행렬 출력: 마지막으로 전치 행렬을 표시하는 방법을 배워 전치 프로세스의 정확성을 확인할 수 있습니다.

이 실습을 마치면 행렬 전치에 대한 확실한 이해와 C 프로그래밍에서 구현할 수 있는 능력을 갖추게 될 것입니다.

차원 및 요소 읽기

이 단계에서는 행렬 전치를 위한 C 프로그램에서 행렬 차원과 요소를 읽는 방법을 배웁니다. 사용자가 행과 열의 개수를 입력하고, 그런 다음 행렬에 값을 채우는 프로그램을 만들 것입니다.

먼저 행렬 전치 프로그램을 위한 새로운 C 파일을 만들어 봅시다.

cd ~/project
nano matrix_transpose.c

이제 행렬 차원과 요소를 읽는 다음 코드를 추가합니다.

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

int main() {
    int rows, cols;
    int matrix[MAX_ROWS][MAX_COLS];

    // 행렬 차원 읽기
    printf("행의 개수를 입력하세요: ");
    scanf("%d", &rows);

    printf("열의 개수를 입력하세요: ");
    scanf("%d", &cols);

    // 행렬 요소 입력
    printf("행렬 요소를 입력하세요:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("요소 [%d][%d] 를 입력하세요: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // 원본 행렬 출력
    printf("\n원본 행렬:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc matrix_transpose.c -o matrix_transpose
./matrix_transpose

예시 출력:

행의 개수를 입력하세요: 3
열의 개수를 입력하세요: 3
행렬 요소를 입력하세요:
요소 [0][0]를 입력하세요: 1
요소 [0][1]를 입력하세요: 2
요소 [0][2]를 입력하세요: 3
요소 [1][0]를 입력하세요: 4
요소 [1][1]를 입력하세요: 5
요소 [1][2]를 입력하세요: 6
요소 [2][0]를 입력하세요: 7
요소 [2][1]를 입력하세요: 8
요소 [2][2]를 입력하세요: 9

원본 행렬:
1 2 3
4 5 6
7 8 9

코드의 주요 부분을 살펴보겠습니다.

  • MAX_ROWSMAX_COLS를 사용하여 최대 행렬 크기를 정의합니다.
  • scanf()를 사용하여 사용자 입력 (행, 열, 행렬 요소) 을 읽습니다.
  • 중첩된 반복문을 사용하여 행렬 요소를 입력하고 표시합니다.
  • 프로그램은 허용된 최대 행렬 크기 내에서 입력을 검증합니다.

행과 열 바꾸기

이 단계에서는 행과 열을 바꿈으로써 행렬을 전치하는 방법을 배웁니다. 이전 프로그램을 수정하여 전치 행렬을 생성할 것입니다.

기존의 matrix_transpose.c 파일을 엽니다.

cd ~/project
nano matrix_transpose.c

이전 코드를 다음 구현으로 바꿉니다.

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

int main() {
    int rows, cols;
    int matrix[MAX_ROWS][MAX_COLS];
    int transposed[MAX_COLS][MAX_ROWS];

    // 행렬 차원 읽기
    printf("행의 개수를 입력하세요: ");
    scanf("%d", &rows);

    printf("열의 개수를 입력하세요: ");
    scanf("%d", &cols);

    // 행렬 요소 입력
    printf("행렬 요소를 입력하세요:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("요소 [%d][%d] 를 입력하세요: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // 행렬 전치
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            transposed[j][i] = matrix[i][j];
        }
    }

    // 원본 행렬 출력
    printf("\n원본 행렬:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    // 전치 행렬 출력
    printf("\n전치 행렬:\n");
    for (int i = 0; i < cols; i++) {
        for (int j = 0; j < rows; j++) {
            printf("%d ", transposed[i][j]);
        }
        printf("\n");
    }

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc matrix_transpose.c -o matrix_transpose
./matrix_transpose

예시 출력:

행의 개수를 입력하세요: 3
열의 개수를 입력하세요: 3
행렬 요소를 입력하세요:
요소 [0][0]를 입력하세요: 1
요소 [0][1]를 입력하세요: 2
요소 [0][2]를 입력하세요: 3
요소 [1][0]를 입력하세요: 4
요소 [1][1]를 입력하세요: 5
요소 [1][2]를 입력하세요: 6
요소 [2][0]를 입력하세요: 7
요소 [2][1]를 입력하세요: 8
요소 [2][2]를 입력하세요: 9

원본 행렬:
1 2 3
4 5 6
7 8 9

전치 행렬:
1 4 7
2 5 8
3 6 9

행렬 전치에 대한 주요 내용:

  • 차원이 바뀐 새로운 행렬 transposed를 생성합니다.
  • 행과 열을 바꿈으로써 전치가 수행됩니다.
  • transposed[j][i] = matrix[i][j]가 핵심 변환입니다.
  • 원본 행렬과 전치 행렬의 차원이 반대로 됩니다.

전치 행렬 출력

이 마지막 단계에서는 가독성과 오류 처리를 개선하여 전치 행렬을 서식화하고 출력하는 방법을 배웁니다. 이전 프로그램을 개선하여 출력을 더욱 전문적으로 만들 것입니다.

matrix_transpose.c 파일을 엽니다.

cd ~/project
nano matrix_transpose.c

이전 코드를 다음 개선된 구현으로 바꿉니다.

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

void printMatrix(int matrix[MAX_ROWS][MAX_COLS], int rows, int cols, const char* title) {
    printf("%s:\n", title);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%4d ", matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

int main() {
    int rows, cols;
    int matrix[MAX_ROWS][MAX_COLS];
    int transposed[MAX_COLS][MAX_ROWS];

    // 입력 유효성 검사
    do {
        printf("행의 개수 (1-%d): ", MAX_ROWS);
        scanf("%d", &rows);
    } while (rows <= 0 || rows > MAX_ROWS);

    do {
        printf("열의 개수 (1-%d): ", MAX_COLS);
        scanf("%d", &cols);
    } while (cols <= 0 || cols > MAX_COLS);

    // 행렬 요소 입력
    printf("행렬 요소를 입력하세요:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("요소 [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // 행렬 전치
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            transposed[j][i] = matrix[i][j];
        }
    }

    // 서식화된 출력으로 행렬 출력
    printMatrix(matrix, rows, cols, "원본 행렬");
    printMatrix(transposed, cols, rows, "전치 행렬");

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc matrix_transpose.c -o matrix_transpose
./matrix_transpose

예시 출력:

행의 개수(1-100): 3
열의 개수(1-100): 3
행렬 요소를 입력하세요:
요소 [0][0]: 1
요소 [0][1]: 2
요소 [0][2]: 3
요소 [1][0]: 4
요소 [1][1]: 5
요소 [1][2]: 6
요소 [2][0]: 7
요소 [2][1]: 8
요소 [2][2]: 9

원본 행렬:
   1    2    3
   4    5    6
   7    8    9

전치 행렬:
   1    4    7
   2    5    8
   3    6    9

이 버전의 주요 개선 사항:

  • 행렬 차원에 대한 입력 유효성 검사를 추가했습니다.
  • 코드 구성을 개선하기 위해 별도의 printMatrix() 함수를 만들었습니다.
  • %4d를 사용하여 정렬된 서식으로 행렬 출력을 개선했습니다.
  • 명확성을 위해 행렬 출력에 제목을 추가했습니다.
  • 다양한 행렬 크기를 더욱 안정적으로 처리합니다.

요약

이 실습에서는 C 프로그램에서 행렬 차원과 요소를 읽고, 행과 열을 바꾸고, 전치 행렬을 출력하는 방법을 배웁니다. 먼저, 프로그램은 사용자에게 행과 열의 개수를 입력하도록 요청하고, 그런 다음 사용자가 행렬 요소를 입력할 수 있도록 합니다. 그런 다음 원본 행렬이 표시됩니다. 다음으로, 프로그램은 행과 열을 바꿔 행렬의 전치를 계산하고 마지막으로 전치 행렬이 출력됩니다.

이 실습에서 핵심적인 학습 내용은 사용자 입력을 읽기 위해 scanf()를 사용하는 것, 행렬 요소를 입력하고 표시하기 위해 중첩 루프를 구현하는 것, 그리고 행과 열을 바꿈으로써 전치 연산을 수행하는 것입니다. 또한, 프로그램은 원본 행렬과 전치 행렬을 표시하기 위해 printf()를 사용하는 방법을 보여줍니다.