소개
이 실습에서는 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_symmetric은false로 설정됩니다. - 비대칭이 발견되면 프로그램은 루프에서 빨리 빠져나옵니다.
대칭 여부 출력
이 마지막 단계에서는 행렬 대칭에 대한 더 자세한 출력을 제공하고 코드 모듈성을 개선하기 위해 함수를 만드는 프로그램을 향상시킵니다.
기존 파일을 열고 코드를 업데이트합니다.
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 크기의 정방 행렬을 입력할 수 있도록 합니다.



