프로젝트/심심풀이

심심풀이 :: [C] 개미수열

appHunter 2009. 5. 6. 19:23
글을 다 날려서 다시 적는다. !!  (2009-05-06에 날림)
2006/11/22 21:04    원본보기

개미수열을 짜 보았다.

개미수열을 모르시는 분은 -_-;
음...

베르나르 베르베르의 소설 .'개미'에 나오는 수열.

1
1 1
1 2
1 1 2 1
1 2 2 1 1 1
1 1 2 2 1 3
1 2 2 2 1 1 3 1

다음과 같은 법칙을 가진다 ^^;

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
static char temp[]={"1"};  // 임시 개미수열 저장 장소
char * ant="1";   // ant 개미 수열
char * ant_str, * ant_num;
void ant_fun();
int main()
{
int i =0;
int line;

ant = (char *)malloc(sizeof(temp)+1);
strcpy(ant,temp);
scanf("%d",&line );   // 라인 수를 입력 받는다.
for(i = 0 ; i < line; i++)  // 15줄 까지 출력 .
{
ant_fun();
printf("\t\t\tNUM = %d",i+1);
}
return 0;
}
void ant_fun()
{
int num=1; // 각각의 수에 갯수
int i,j,n ; //for문을 사용하기 위해서
int len,len1,len2;   // string 길이

len = strlen(ant);
// printf("\n %d",len);
ant_str = (char *)malloc(len+1);
ant_num = (char *)malloc(len+1);
printf("\n");
for( i =0 , j = 0, n = 0 ; *(ant + i ) != '\0'; i++)  // i가 \0 일때까지 for문 돌린다.
// for( i =0 , j = 0, n = 0 ; i < len; i++)
{
if( *(ant +i) == *(ant + i + 1) )   // 전과 후가 같으면 갯수 증가
{
  num++;
}
else                               // 다르면 출력 , num 갯수 1로 초기화
{
  printf("%c%d",*(ant +i) , num );  
  ant_str[j++] = *(ant+i) ;        // 각각의 값을 temp 배열에 넣는다.
  ant_num[n++] = num + '0' ;       // 각가 숫자도 넣는다  .
  num = 1;
}
}

ant_str[j] = '\0';
ant_num[n] = '\0';
free(ant);             // 메모리 해제한다
len1 = strlen(ant_str);
len2 = strlen(ant_num);
ant = (char *)malloc(len1+len2+1);

for(i =0,j=0 ; *(ant_str + i ) != '\0'  ; i++)
{
ant[j++] = *(ant_str+i);
ant[j++] = *(ant_num+i);
}
ant[j] = '\0';         // 문자열이기 때문에 젤 마지막에 \0 을 넣는다
free(ant_str);
free(ant_num);
}

포인터를 사용해서 개미수열을 코딩해 보았다.
약간은 원리(?) 를 이해하고 풀어야 했던 문제였다.