표준 입력으로 정사각행렬의 크기가 입력됩니다(입력 값의 범위는 2~10). 입력된 크기만큼의 단위행렬을 출력하는 프로그램을 만드세요(scanf 함수 호출 전에 문자열을 출력하면 안 됩니다). 숫자와 숫자 사이는 공백으로 띄웁니다.
단위행렬은 왼쪽 위부터 오른쪽 아래까지의 대각선(주대각선)이 1이며 나머지는 모두 0인 행렬입니다.
표준 입력
5
표준 출력
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
정답
#include <stdio.h>
#include <stdlib.h>
int main()
{
int size;
scanf("%d", &size);
int **m = malloc(sizeof(int*)*size); // 이중 포인터에 (int 포인터 크기 * size)만큼 동적 메모리 할당(배열의 세로)
for (int i = 0; i < size; i++)
{
m[i] = malloc(sizeof(int)*size); // (int의 크기 * size)만큼 동적 메모리 할당(배열의 가로)
}
for (int i = 0; i < size; i++) // size 크기만큼 반복(세로)
{
for (int j = 0; j < size; j++) // size 크기만큼 반복(가로)
{
if (i == j)
m[i][j] = 1; // 대각선은 i와 j가 같으므로 i와 j가 같으면 1을 할당
else
m[i][j] = 0; // 단위행렬에서 대각선 제외 나머지는 0이므로 i와 j가 같지 않은 경우는 0을 할당
}
}
for (int i = 0; i < size; i++) // size 크기만큼 반복(세로)
{
for (int j = 0; j < size; j++) // size 크기만큼 반복(가로)
{
printf("%d ", m[i][j]); // 2차원 배열의 인덱스에 반복문의 변수 i,j를 지정
}
printf("\n"); // 가로 요소를 출력한 뒤 다음 줄로 넘어간다
}
for (int i = 0; i < size; i++) // size 크기만큼 반복(세로)
{
free(m[i]); // 2차원 배열의 가로 공간 메모리 해제
}
free(m); // 2차원 배열의 세로 공간 메모리 해제
return 0;
}
해설
입력 하나로 단위 행렬의 크기가 결정되고 가로와 세로의 크기는 똑같으므로, 변수 하나를 입력받아 입력받은 만큼 동적 메모리 할당을
해준다. 그리고 단위 행렬의 특징은 왼쪽 위부터 오른쪽 아래까지의 대각선이 1이며 나머지는 모두 0인 행렬이므로 대각선에 위치하는 곳은 1을 할당해주고 나머지는 0을 할당해주어야 한다. 대각선의 특징은 이중 루프 안에서 i와 j의 값이 같으므로 i와 j의 값이 같으면 1, 같지
않으면 0을 할당해주록 코드를 만들고, 2차원 배열을 출력해주는 코드를 만든다. 마지막으로 2차원 배열의 가로 공간 메모리 해제한 다음
세로 공간 메모리를 해제해주면 정답이 된다.
'C' 카테고리의 다른 글
[C] C언어 코딩 도장 37.9 심사문제: 전치행렬 구하기 (0) | 2022.04.27 |
---|---|
[C] C언어 코딩 도장 36.13 심사문제: 가장 작은 수 출력하기 (0) | 2022.04.27 |
[C] C언어 코딩 도장 35.7 심사문제: 두 정수의 합 구하기 (0) | 2022.04.27 |
[C] C언어 코딩 도장 34.10 심사문제: 포인터와 주소 연산자 사용하기 (0) | 2022.04.27 |
[C] C언어 코딩 도장 33.8 심사문제: 5와 11의 배수, 공배수 처리하기 (0) | 2022.04.27 |