...
달팽이 배열
달팽이 배열은 주어진 수(n)에 맞춰 nxn의 이중 배열을 생성하여서, 시계 방향으로 숫자가 늘어나는 배열이다.
이 시계 방향이 마치 달팽이 껍질 형태기 때문에 그리 부르는 듯 하다.
아래의 사진처럼 4x4 배열을 보면 더 이해가 갈 것이다.
예제 1)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include "matrix_ptf.h"
#define N 5
void ptf(int a[N][N]);
void snail_sort(int a[N][N]);
int main()
{
clock_t start,end;
start = clock();
int arr[N][N];
int i,j;
int (*p1)[N]=arr;
srand(time(NULL));
//중복되지 않는 난수 1~ N*N 까지 대입
for(i=0;i<N*N;i++)
{
(*p1)[i] = rand() % (N*N)+1;//1에서 25까지
for(j=0;j<i;j++)
{
if((*p1)[i] == (*p1)[j])
{
i--;
break;
}
}
}
puts("\n 정렬 전");
matrix_ptf(arr,5,5);
snail_sort(arr);
printf("\n\n");
puts(" 정렬 후");
matrix_ptf(arr,N,N);
end = clock();
printf("\n%d %d",start, end);
printf("\n\n%lf초", (end-start) / (double)1000);
system("pause");
//exit(0);
return 0;
}
void snail_sort(int a[N][N])
{
int arr2[N][N];
int (*p)[N] = arr2;
int index,tmp,i,j,
revol=N,num=0,n1=0,n2=-1,A=1;
//피난처에 그대로 대입
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
arr2[i][j] = a[i][j];
}
}
//선택 정렬(포인트) - 최솟값을 index에 넣어서 왼쪽부터 정렬시켜 오름차순이 되게 하는 정렬
for(i=0;i<N*N-1;i++)
{
index = i;
for(j=i+1;j<N*N;j++)
{
if((*p)[index] > (*p)[j])
index = j;
}
tmp = (*p)[index];
(*p)[index] = (*p)[i];
(*p)[i] = tmp;
}
//달팽이 정렬
while(1)
{
for(i=0;i<revol;i++)
{
n2+=A;
a[n1][n2] = (*p)[num];
num++;
}
revol--;//회전수 감소
if(revol==0)
break;//정렬을 하다보면 최종적으로 가로 수 만큼 돌게된다. 6/6행렬이면 6번 회전한다.
for(i=0;i<revol;i++)
{
n1+=A;
a[n1][n2] = (*p)[num];
num++;
}
A = -A;//중요!! 양음 변경
}
}
void ptf(int a[N][N])
{
int i,j;
printf("┏");
for(j=1;j<N;j++)
{
printf("━┳");
}
printf("━┓\n");
for(i=0;i<N;i++)
{
printf("┃");
for(j=0;j<N;j++)
{
if(a[i][j]==0)
printf(" ┃");
else
printf("%-2d┃", a[i][j]);
}
putchar('\n');
if(i<N-1)
{
printf("┣");
for(j=1;j<N;j++)
{
printf("━╋");
}
printf("━┫\n");
}
else
{
printf("┗");
for(j=1;j<N;j++)
{
printf("━┻");
}
printf("━┛\n");
}
}
}
예제 2)
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <windows.h>
#define N 11
#define M 11
#define ESC 0x1b
void ptf_arr(int x[N][M]);
void bubble(int x[N][M]);
void spiral(int x[N][M]);
void gotoxy(int x, int y);
void swap(int* x, int* y);
double avg(int x[5]);
int main()
{
int matrix[N][M],matrix2[N][M],matrix3[N*M]={0},curser;
/*matrix : 변환행렬
matrix2 초깃값행렬
matrix3 2차원->1차원 행렬
curser gotoxy문 변수
hit 버튼누르기
*/
int i=0,j,k=0,sum=0,hit;
srand(time(NULL));
gotoxy(40,6);
puts("[ 조대학교 수업 레포트 #1 ]");
gotoxy(80,20);
puts("┏━━━━━━━┓");
gotoxy(80,21);
puts("┃ 컴퓨터공학과 ┃");
gotoxy(80,22);
puts("┃ 201XXXXXXX ┃");
gotoxy(80,23);
puts("┃ 홍 길 동 ┃");
gotoxy(80,24);
puts("┗━━━━━━━┛");
Sleep(1300);
system("cls");
//puts("┏┓┗┛┃┣┫━");
while(i<3)
{
gotoxy(40,6);
printf("무작위 [ %d / %d ] 행렬", N, M);
gotoxy(40,7);
printf("- 행렬 설정중 \r");
Sleep(500);
//system("cls");
//gotoxy(40,6);
//printf("무작위 [ %d / %d ] 행렬", N, M);
gotoxy(40,7);
printf("- 행렬 설정중. \r");
Sleep(500);
//system("cls");
//gotoxy(40,6);
//printf("무작위 [ %d / %d ] 행렬", N, M);
gotoxy(40,7);
printf("- 행렬 설정중.. \r");
Sleep(500);
//system("cls");
//gotoxy(40,6);
//printf("무작위 [ %d / %d ] 행렬", N, M);
gotoxy(40,7);
printf("- 행렬 설정중...\r");
Sleep(500);
//system("cls");
i++;
}
for(i=0;i<N*M;i++)//중복되지 않는 랜던값대입
{
matrix3[i] = rand()%(N*M)+1;
for(j=0;j<i;j++)//1차원 간접배열에 대입
{
if(matrix3[j] == matrix3[i])
{
i--;
break;
}
}
}
for(i=0;i<N;i++)//1차원 배열원소를 2차원 배열에 대입
{
for(j=0;j<M;j++)
{
matrix[i][j] = matrix3[k];
matrix2[i][j] = matrix3[k];
k++;
}
}
do
{
i=0,j,k=0,sum=0;
ptf_arr(matrix2);
gotoxy(29,4+N+M);
puts("┏━━━━━━━━━━━━━━━━━━━━━━┓");
gotoxy(29,5+N+M);
puts("┃ 숫자키를 눌러 원하는 모드를 선택해 주세요. ┃");
gotoxy(29,6+N+M);
puts("┃ ┃");
gotoxy(29,7+N+M);
puts("┃ 1번 : 순차정렬 ┃");
gotoxy(29,8+N+M);
puts("┃ 2번 : 나선정렬 ┃");
gotoxy(29,9+N+M);
puts("┃ 3번 : ↘ 대각선의 합 ┃");
gotoxy(29,10+N+M);
puts("┃ 4번 : ↙ 대각선의 합 ┃");
gotoxy(29,11+N+M);
puts("┃ ESC : 끝내기 ┃");
gotoxy(29,12+N+M);
puts("┗━━━━━━━━━━━━━━━━━━━━━━┛");
printf("\n\n");
hit = getch();
if(hit == '1')//순차정렬
{
curser = 0;
system("cls");
bubble(matrix);
gotoxy(10,7);
puts("* 순차 정렬 *");
ptf_arr(matrix);
}
else if(hit == '2')//나선정렬
{
curser = 0;
system("cls");
spiral(matrix);
gotoxy(10,7);
puts("* 나선 정렬 *");
ptf_arr(matrix);
}
else if(hit == '3')//↘ 대각선의 합
{
i=0,j=0;
while(k<N)
{
printf("%d + ",matrix2[i][j]);
sum += matrix2[i][j];
i++;
j++;
k++;
}
printf("\b\b= %3d", sum);
}
else if(hit == '4')//↙ 대각선의 합
{
i=0,j=M-1;
while(k<N)
{
printf("%d + ",matrix2[i][j]);
sum += matrix2[i][j];
i++;
j--;
k++;
}
printf("\b\b= %3d", sum);
}
if(hit != ESC)
{
puts("\n\n\n>> 계속하려면 아무키나 누르세요.");
getch();
}
system("cls");
}while(hit != ESC);
system("pause");
return 0;
}
//함수
void ptf_arr(int x[N][M])//행렬출력
{
int curser=0,i,j;
gotoxy(30,2);
puts("┏");
for(i=0;i<N*4;i++)
{
gotoxy(31+(++i),2); //2씩 증가하는 공식 1 + (++i) -> 2,4,6...
printf("━");
}
printf("┓");
for(i=0;i<N;i++)
{
gotoxy(30,3+curser);
printf("┃");
for(j=0;j<M;j++)
{
printf("%3d ", x[i][j]);
}
printf("┃");
curser++;
gotoxy(30,3+curser);
puts("┃");
for(j=0;j<N*4;j++)
{
gotoxy(31+(++j),3+curser);
printf(" ");
}
printf(" ┃");
curser++;
}
curser--;
gotoxy(30,3+curser);
puts("┗");
for(i=0;i<N*4;i++)
{
gotoxy(31+(++i),3+curser);
printf("━");
}
printf("┛");
}
void bubble(int x[N][M])//버블소트
{
int x2[N*M],k=0,i,j;
char yes;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
*(x2+k) = x[i][j];
k++;
}
}
for(i=0;i<N*M-1;i++)
{
yes = 'n';
for(j=0;j<N*M-1-i;j++)
{
if(x2[j]>x2[j+1])
{
swap(&x2[j],&x2[j+1]);
yes = 'y';
}
}
if(yes == 'n')
break;
}
k=0;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
x[i][j] = *(x2+k);
k++;
}
}
}
void spiral(int x[N][M])//나선정렬
{
int x2[N*M],k=0,i,j;
char yes;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
*(x2+k) = x[i][j];
k++;
}
}
for(i=0;i<N*M-1;i++)
{
yes = 'n';
for(j=0;j<N*M-1-i;j++)
{
if(x2[j]>x2[j+1])
{
swap(&x2[j],&x2[j+1]);
yes = 'y';
}
}
if(yes == 'n')
break;
}
k=0,i=0,j=0;
int c1=N,c2=M,c3=-1,c4=0;
/*
c1 열 -> 이동 제한값 ++
c2 행 ↓이동 제한값 ++
c3 열 <- 이동 제한값 --
c4 행 ↑이동 제한값 --
*/
do
{
while(j<c2)
{
x[i][j] = *(x2+k);
k++;
j++;
}
j --;
i ++;
while(i<c1)
{
x[i][j] = *(x2+k);
k++;
i++;
}
j --;
i --;
while(j>c3)
{
x[i][j] = *(x2+k);
k++;
j--;
}
j ++;
i --;
while(i>c4)
{
x[i][j] = *(x2+k);
k++;
i--;
}
j++;
i++;
c1--;
c2--;
c3++;
c4++;
}while(k < N*M);
}
void swap(int* x,int* y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
void gotoxy(int x,int y)
{
COORD Cur;
Cur.X=x;
Cur.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Cur);
}
인용한 부분에 있어 만일 누락된 출처가 있다면 반드시 알려주시면 감사하겠습니다
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.