어디선가 문제가 나왔다더라. 10분 안에 개미수열을 파이썬으로 짜라던가.
나는 파이썬은 잘 모르는데 사실 베르나르 베르베르의 소설 개미도 재미있게 읽었던 편이고, 수열 자체는 보면서 야, 이렇게 생각할 수도 있구나 싶었던 차라 C 언어로 한번 해보기로 했다.
모르는 사람을 위해 설명하면 이런 거다.
1 --> 일(1) 하나(1)
11 --> 일(1) 둘(2)
12 --> 일(1) 하나(1) 이(2) 하나(1)
1121 --> 일(1) 둘(2) 이(2) 하나(1) 일(1) 하나(1)
122111 --> ...
이런 식으로 쭉 이어지는 거다. 일견 보면 이거랑 같은 형식이라고 보면 된다.
aaaabbbbccddddddd
--> a5b4c2d7
만들면 이렇게 된다.
사실 이 포스팅에 있는 코드대로 하면 오류가 난다. 왜 그런고 하니 중간에 결과 인쇄를 위한 배열이 있는데 그 배열 크기가 10글자라 수열의 총 글자 수가 10글자가 넘어가면 에러가 난다.
사실 이거 올리기 전 까지 수열 길이 더 길게 만들고 있었는데 그냥 편의상 10글자로 한거라..... 알아서 참고합시다. 배열 이름은 temp_arr 하고 arr 입니다. 거기서 글자 수만 수정하면 거 길게 나옴.
개념은 다음과 같다. 가령 예를 들어 수열 1121 이 있다고 한다면
11 2 1 의 세 마디로 나누어서 생각하는 것이다. 한 마디 입력하고, 한 마디 입력하고, 한 마디 입력하고.
그리고 수열을 구하는 함수 안에서는 다시 그 함수가 호출되도록(재귀) 해서 다음 수열이 도출되게 만든다.
코드는 아래와 같다.
#include <stdio.h>
int ant_array(int *p, int *arr, int *temp_arr);
void print_arr(int *arr);
int main()
{
int i=0;
int arr[10];
int temp_arr[10];
arr[0]=1;
printf("1 \n");
ant_array(&i, arr, temp_arr);
return 0;
}
int ant_array(int *p, int *arr, int *temp_arr)
{
int a, b,c,d;
a=1; b=0; c=0; d=0;
for(;;)
{
for(;;)
{
*temp_arr=*arr;
if(*arr==*(arr+1))
{
arr++;
a++; c++;
}
else
{
temp_arr++; d++;
*temp_arr=a;
temp_arr++; d++;
arr++; c++;
a=1;
break;
}
}
if(*arr<1 || *arr>9)
{
arr=arr-c;
c=0;
break;
}
}
temp_arr=temp_arr-d;
d=0;
for(b=0;b<10;b++)
{
if(temp_arr[b]>0 && temp_arr[b]<10)
{
arr[b]=temp_arr[b];
}
else
{
break;
}
}
*p=*p+1;
if(*p<10)
{
print_arr(arr);
ant_array(p, arr, temp_arr);
}
else
{
return 0;
}
}
void print_arr(int *arr)
{
int a;
for(a=0;a<10;a++)
{
if(arr[a]>0 && arr[a]<10)
{
printf("%d", arr[a]);
}
else
{
break;
}
}
printf("\n");
}
C 언어 예제, 메모리 동적 할당 + 구조체와 노드 다루기 (0) | 2015.01.05 |
---|---|
C 언어 예제, 동적 할당된 메모리 갯수 바꾸기 (0) | 2015.01.04 |
C 언어 예제, 100의 자리 큰수 계산기(구조체 이용) (스압) (0) | 2014.08.17 |
C 언어 예제, string 문자열 int 형으로 전환하기 (0) | 2014.06.28 |
C언어 예제, 도서관리 프로그램-구조체 응용 (0) | 2014.06.10 |
댓글 영역