C 언어로 행렬의 대칭 여부 확인하기

CBeginner
지금 연습하기

소개

이 실습에서는 C 프로그래밍에서 행렬이 대칭인지 확인하는 방법을 배웁니다. 이 실습은 행렬의 차원과 요소를 읽고, 대칭 위치의 요소를 비교하여 행렬이 대칭인지 확인하고, 행렬이 대칭인지 아닌지 출력하는 단계를 다룹니다. 이 실습은 C 에서 행렬 대칭 확인 과정을 이해하는 데 도움이 되는 단계별 가이드와 코드 예제를 제공합니다.

이 실습은 C 프로그래밍을 사용하여 행렬의 차원과 요소를 읽는 방법을 보여주면서 시작합니다. 그런 다음 대칭 위치의 요소를 비교하여 행렬이 대칭인지 확인하는 논리를 소개합니다. 마지막으로, 행렬이 대칭인지 아닌지 나타내는 결과를 출력하는 방법을 보여줍니다.

차원 및 요소 읽기

이 단계에서는 행렬 대칭 확인을 위해 C 프로그래밍에서 행렬 차원과 요소를 읽는 방법을 배웁니다. 사용자가 행렬의 크기와 요소를 입력할 수 있도록 프로그램을 만들 것입니다.

먼저 행렬 대칭 프로그램을 위한 새로운 C 파일을 생성합니다.

cd ~/project
nano symmetric_matrix.c

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

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int n, matrix[MAX_SIZE][MAX_SIZE];

    // 행렬 차원 읽기
    printf("정방 행렬의 크기를 입력하세요: ");
    scanf("%d", &n);

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

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

    return 0;
}

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

gcc symmetric_matrix.c -o symmetric_matrix
./symmetric_matrix

예시 출력:

정방 행렬의 크기를 입력하세요: 3
행렬 요소를 입력하세요:
요소 [0][0]를 입력하세요: 1
요소 [0][1]를 입력하세요: 2
요소 [0][2]를 입력하세요: 3
요소 [1][0]를 입력하세요: 2
요소 [1][1]를 입력하세요: 4
요소 [1][2]를 입력하세요: 5
요소 [2][0]를 입력하세요: 3
요소 [2][1]를 입력하세요: 5
요소 [2][2]를 입력하세요: 6

입력된 행렬:
1 2 3
2 4 5
3 5 6

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

  • #define MAX_SIZE 100은 버퍼 오버플로우를 방지하기 위해 최대 행렬 크기를 설정합니다.
  • scanf()는 행렬 차원과 개별 요소를 읽는 데 사용됩니다.
  • 중첩된 반복문은 행렬 요소를 입력하고 표시하는 데 사용됩니다.
  • 프로그램은 사용자가 100x100 까지의 임의 크기의 정방 행렬을 입력할 수 있도록 합니다.

A[i][j] = A[j][i] 확인

이 단계에서는 이전 프로그램을 수정하여 행과 열을 따라 요소를 비교하여 행렬이 대칭인지 확인합니다.

기존 파일을 열고 코드를 업데이트합니다.

cd ~/project
nano symmetric_matrix.c

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

#include <stdio.h>
#include <stdbool.h>

#define MAX_SIZE 100

int main() {
    int n, matrix[MAX_SIZE][MAX_SIZE];
    bool is_symmetric = true;

    // 행렬 차원 읽기
    printf("정방 행렬의 크기를 입력하세요: ");
    scanf("%d", &n);

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

    // 대칭 여부 확인
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (matrix[i][j] != matrix[j][i]) {
                is_symmetric = false;
                break;
            }
        }
        if (!is_symmetric) break;
    }

    // 대칭 결과 출력
    if (is_symmetric) {
        printf("\n행렬은 대칭입니다.\n");
    } else {
        printf("\n행렬은 대칭이 아닙니다.\n");
    }

    return 0;
}

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

gcc symmetric_matrix.c -o symmetric_matrix
./symmetric_matrix

대칭 행렬에 대한 예시 출력:

정방 행렬의 크기를 입력하세요: 3
행렬 요소를 입력하세요:
요소 [0][0]를 입력하세요: 1
요소 [0][1]를 입력하세요: 2
요소 [0][2]를 입력하세요: 3
요소 [1][0]를 입력하세요: 2
요소 [1][1]를 입력하세요: 4
요소 [1][2]를 입력하세요: 5
요소 [2][0]를 입력하세요: 3
요소 [2][1]를 입력하세요: 5
요소 [2][2]를 입력하세요: 6

행렬은 대칭입니다.

비대칭 행렬에 대한 예시 출력:

정방 행렬의 크기를 입력하세요: 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

행렬은 대칭이 아닙니다.

코드의 주요 내용:

  • is_symmetric 부울 변수는 행렬 대칭 여부를 추적합니다.
  • 중첩된 반복문은 matrix[i][j]matrix[j][i]와 비교합니다.
  • 어떤 요소가 다른 경우 is_symmetricfalse로 설정됩니다.
  • 비대칭이 발견되면 프로그램은 루프에서 빨리 빠져나옵니다.

대칭 여부 출력

이 마지막 단계에서는 행렬 대칭에 대한 더 자세한 출력을 제공하고 코드 모듈성을 개선하기 위해 함수를 만드는 프로그램을 향상시킵니다.

기존 파일을 열고 코드를 업데이트합니다.

cd ~/project
nano symmetric_matrix.c

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

#include <stdio.h>
#include <stdbool.h>

#define MAX_SIZE 100

// 행렬 대칭 여부를 확인하는 함수
bool is_symmetric_matrix(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (matrix[i][j] != matrix[j][i]) {
                return false;
            }
        }
    }
    return true;
}

// 행렬을 출력하는 함수
void print_matrix(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    printf("\n행렬:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%4d ", matrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int n, matrix[MAX_SIZE][MAX_SIZE];

    // 행렬 차원 읽기
    printf("정방 행렬의 크기를 입력하세요: ");
    scanf("%d", &n);

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

    // 입력된 행렬 출력
    print_matrix(matrix, n);

    // 대칭 여부 확인 및 출력
    if (is_symmetric_matrix(matrix, n)) {
        printf("\n대칭 분석:\n");
        printf("✓ 행렬은 대칭입니다.\n");
        printf("  - 모든 요소 A[i][j] 는 A[j][i] 와 같습니다.\n");
        printf("  - 전치 행렬과 같습니다.\n");
    } else {
        printf("\n대칭 분석:\n");
        printf("✗ 행렬은 대칭이 아닙니다.\n");
        printf("  - 일부 요소 A[i][j] 는 A[j][i] 와 같지 않습니다.\n");
    }

    return 0;
}

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

gcc symmetric_matrix.c -o symmetric_matrix
./symmetric_matrix

대칭 행렬에 대한 예시 출력:

정방 행렬의 크기를 입력하세요: 3
행렬 요소를 입력하세요:
요소 [0][0]를 입력하세요: 1
... (생략)

행렬:
   1    2    3
   2    4    5
   3    5    6

대칭 분석:
✓ 행렬은 대칭입니다.
  - 모든 요소 A[i][j]는 A[j][i]와 같습니다.
  - 전치 행렬과 같습니다.

비대칭 행렬에 대한 예시 출력:

정방 행렬의 크기를 입력하세요: 3
행렬 요소를 입력하세요:
요소 [0][0]를 입력하세요: 1
... (생략)

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

대칭 분석:
✗ 행렬은 대칭이 아닙니다.
  - 일부 요소 A[i][j]는 A[j][i]와 같지 않습니다.

주요 개선 사항:

  • 코드 구성을 개선하기 위해 is_symmetric_matrix() 함수를 추가했습니다.
  • 행렬 내용을 표시하기 위해 print_matrix() 함수를 만들었습니다.
  • 대칭 분석을 자세히 출력했습니다.
  • 대칭 여부를 시각적으로 표시하기 위해 ✓/✗를 사용했습니다.

요약

이 실습에서는 C 프로그래밍에서 행렬의 차원과 요소를 읽고 행렬이 대칭인지 확인하는 방법을 배웁니다. 먼저, 사용자가 행렬의 크기와 요소를 입력할 수 있도록 프로그램을 만듭니다. 그런 다음, 각 요소 A[i][j]가 해당 요소 A[j][i]와 같은지 확인하여 행렬이 대칭인지 확인하도록 프로그램을 수정합니다. 마지막으로 행렬이 대칭인지 아닌지 출력합니다.

완료된 단계에서 얻을 수 있는 주요 학습 내용은 scanf()를 사용하여 행렬 차원과 요소를 읽고, 입력된 행렬을 표시하고, 행렬 요소를 비교하여 대칭 여부를 결정하는 것입니다. 이 프로그램은 사용자가 최대 100x100 크기의 정방 행렬을 입력할 수 있도록 합니다.