질문 원본 : https://gall.dcinside.com/programming/2332356


지금 컴터에 있는 비주얼 스튜디오는 C99가 아니라 코드 존재 자체를 거부하길래 온라인 컴파일러로 테스트함


위 아래 코드가 같음


아래 있는 매개변수의 -를 + 로 바꿔줌


작동함


근데 숫자가 6 넘어가면 뻗음



배열 두 줄 채울 때마다 이 친구가 배열을 전부 곱해서 검사하는 게 문제인 거 같음.


배열에서 0을 발견했으면 그 즉시 빤스런 하라고 시킴


그리고 이 친구는 왜 무조건 처음 한번만 작동 시킬 거면서 반복문 안에 있음


반복문 밖으로 꺼내고 다른 거 만지기 귀찮아서 x를 2부터 시작하게 바꿈



잘됨

10 보다 큰 수도 테스트는 했는데 지저분 하게 보여서 안 가져옴




그 외에

자신의 포인터 다루는 솜씨를 뽐내는 건지 전역변수에 포인터 지정은 왜 한건지 모르겠지만 이건 당장 체감 성능이랑 관계도 없고,

이거 하나 바꾸려면 엮인 식이 너무 많아서 수정 안 함



전체 코드임

#include <stdio.h>

int void1 = 0;

int void2 = 0;

int *pn1 = &void1;

int *pn2 = &void2;


int checkarr(int length, int (*arr1)[length])

{

int num1 = 1;

for (int n1 = 0; n1 < length; n1++)

{

for (int n2 = 0; n2 < length; n2++)

{

if((arr1[n1][n2]) == 0)

{

num1 = 0;

n1 = length;

break;

}

}

}

return num1;

}


void voidarr(int length, int (*arr1)[length])

{

for (int n1 = 0; n1 < length; n1++)

{

for (int n2 = 0; n2 < length; n2++)

{

arr1[n1][n2] = 0;

}

}

}


void printfarr(int length, int (*arr1)[length])

{

for (int n1 = 0; n1 < length; n1++)

{

for (int n2 = 0; n2 < length; n2++)

{

printf("%3d", arr1[n1][n2]);

}

printf("\n");

}

}


void _arr(int length, int (*arr1)[length], int n1, int n2, int n3, int *pn3, int n4)

{

if (n4 == 0)

{

{

do

{

if (arr1[n1][n2] == 0)

{

arr1[n1][n2] = n3;

n3++;

n2++;

}

else

break;

} while (!((n2 == 0) || (n2 == length)));

}

*pn2 = n2 - 1;

}

else

{

do

{

if (arr1[n1][n2] == 0)

{

arr1[n1][n2] = n3;

n3++;

n2--;

}

else

{

break;

}

} while (!((n2 == -1) || (n2 == length)));

*pn2 = n2 + 1;

}

*pn1 = n1;

*pn3 = n3;

}


int larr(int length, int (*arr1)[length], int n1, int n2, int n3, int *pn3, int n4)

{

if (n4 == 0)

{

{

do

{

if (arr1[n1][n2] == 0)

{

arr1[n1][n2] = n3;

n3++;

n1++;

}

else

{

break;

}

} while (!((n1 == 0) || (n1 == length)));

*pn1 = n1 - 1;

}

}

else

{

do

{

if (arr1[n1][n2] == 0)

{

arr1[n1][n2] = n3;

n3++;

n1--;

}

else

{

break;

}

} while (!((n1 == -1) || (n1 == length)));

*pn1 = n1 + 1;

}

*pn2 = n2;

*pn3 = n3;

}


int main(int argc, char *argv[])

{

int x = 2;

int a;

int b = 1;

int *pb = &b;

scanf("%d", &a);

int arr1[a][a];

voidarr(a, arr1);


_arr(a, arr1, *pn1, *pn2, b, pb, 0);

larr(a, arr1, *pn1 + 1, *pn2, b, pb, 0);

for (; !(checkarr(a, arr1)); x++)

{

if ((x % 2) == 0)

{

_arr(a, arr1, *pn1, *pn2 - 1, b, pb, 1);

larr(a, arr1, *pn1 - 1, *pn2, b, pb, 1);

}

else if ((x % 2) == 1)

{

_arr(a, arr1, *pn1, *pn2 + 1, b, pb, 0);

larr(a, arr1, *pn1 + 1, *pn2, b, pb, 0);

}

}

printfarr(a, arr1);


return 0;

}




세줄 요약

1. 식에 +를 -로 써서 작동 안 했었음.

2. 내가 약간 더 최적화 시킴

3. 그래도 제법 잘 만든 코드였음.


-끝-