입력된 크기만큼의 2차원 배열을 만들고 세로 방향으로 1,2,3,4... 요소를 넣어 출력하는 것이 목적이다. 포인터 학습이 주 목적이므로 포인터, 메모리 동적할당을 사용해 풀이하겠다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int **p;
int n;
scanf("%d", &n);
// 2차원 배열 이중 포인터 선언, 크기를 담을 변수 선언 및 입력
p = malloc(sizeof(int*) * n);
for (int i = 0; i < n; i++)
{
p[i] = malloc(sizeof(int) * n);
}
// 크기만큼 메모리를 확보하고 그 주소들을 p에 저장
int count = 1;
// 배열에 넣어줄 값
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
p[j][i] = count;
count++;
}
}
// n*n만큼 반복하며 배열의 세로, 가로를 반대로한 인덱스 요소에 count 값을 넣어줌
// count는 매 반복마다 증가
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d ", p[i][j]);
}
printf("\n");
}
// 형식에 맞게 배열 출력
for (int i = 0; i < n; i++)
{
free(p[i]);
}
free(p);
// 확보한 2차원 배열 메모리를 해제
}
먼저 2차원 배열의 크기를 담을 변수를 선언하고 입력을 받았다. 또한 2차원 배열 포인터를 만들기 위해 이중 포인터 p를 선언하고 입력 받은 크기로 동적 메모리 할당을 받아 2차원 배열 메모리를 생성했다.
그리고 매 반복마다 1씩 증가하며 배열의 인덱스들에 넣어줄 값인 count를 선언하고, 이제는 익숙한 이중 for문으로 p의 요소들에 모두 접근하는데 이 때 p[j][i] 이렇게 가로 세로를 바꿔서 해당 인덱스에 count 값을 넣어준다. 그 후 count에 1을 더해준다.
원래대로 p[i][j]를 해주면 2 2 크기의 2차원 배열이 있다 가정할 때
1 2
3 4
가 되버린다. 따라서 count를 넣을 인덱스의 가로와 세로만 바꿔준다면
1 3
2 4
처럼 반대로 값이 넣어지는 것이다.
이 과정을 거친 후 이중 for문으로 출력 형식대로 p의 요소들을 출력해준 후 free와 for문을 이용해 p의 요소로 들어있는 가로의 메모리 주소들, 이중 포인터 p가 가리키는 세로 주소의 메모리를 해제해준다.
'Old (2021.01 ~ 2021.12) > Algorithm' 카테고리의 다른 글
CodeUp 1416 : 2진수 변환 (0) | 2021.03.07 |
---|---|
CodeUp 1098 : 설탕과자 뽑기 (0) | 2021.03.07 |
CodeUp 1810 : (포인터) 부분 문자열 (0) | 2021.03.07 |
CodeUp 1581 : swap 함수 만들기 (0) | 2021.03.07 |
CodeUp WriteUp With C Language (0) | 2021.02.27 |