이산치 수학
K-Combination




                  C1조
 조원 : 박구남,정준용,민영지,최고봉
1. 조원별 업무 분담
박구남     최종 보고서 작성 및 프로젝트 총괄




정준용     알고리즘에 대한 소스 구현 및 코딩 작업




최고봉     알고리즘에 대한 소스 구현 및 코딩 작업




민영지     K-Combination에 대한 자료조사 및 다른 K-sample등 자료조사




2. 일정

4/9    각 조원들 역할분담 및 자료조사



4/16   초안 검토 및 K-Combination에 관하여 토의



4/18   최종안 확인 및 보고서 작성
3. 자료 조사

             원소의 순서
                      순서 유관           순서 무관
 원소의 반복


                      k-permutation   k-combination
 비 반복 추출
                      (k-순열)          (k-조합)



 반복 추출                k-sample        k-selection



 중복 원소 추출             pattern         partition




k - sample
집합 S로부터 k개를 선택하는 작업 중 하나.
반복을 허락하지만, 다른 순서의 독같은 원소는 목록에서 구별된다.




k - selection
집합 S로부터 k개를 선택 할 경우 반복은 허락하지만, 순서에 상관 없이 같은 원소는 동일
하게 취급하는데, 이 경우의 목록을 집합 S로부터의 k - selection라고 한다.




k - permutations
집합 S로부터 k개를 선택하는데 반복은 허락하지 않는다. 하지만 선택된 원소들의 순서는
목록에서 구별한다.
n개의 원소를 가진 집합으로부터 k-순열의 수는 P(n,k)혹은 nPk라는 기호를 사용한다.




k - combinations
집합 S로부터 k개를 선택하는데 반복을 허락하지 않고 순서에 상관없이 구성.
이 같은 원소는 똑같이 취급하는 경우의 목록을 k-조합(K-Combination)라고 한다.
집합 S의 k-조합은 S의 부분 집합과 정확히 일치한다.
k-조합의 수는 C(n,k)혹은 nCk라는 기호를 사용한다.

초안
#include <stdio.h>
void main(){
        char input[43];
        char *element;
        int *a, *b;
        int n,r;
        int i,j;


        scanf("%s %d",input,&r);
        n = (strlen(input)-1)/2;
        element = (char *)malloc(n*sizeof(char));
        for (i=0,j=0; i<strlen(input);i++){
                   if(input[i] != ',' && input[i] != '{' && input[i] !='}'){
                              element[j]=input[i];
                              j++;
                   }
        }
        a = (int *)malloc(r*sizeof(int));
        b = (int *)malloc(r*sizeof(int));
        for(i=0;i<r;i++){
                   a[i] = 1;
                   if(i==0)
                              a[i] = 0;
        }
        while(a[0] !=n-r){
        b[0] = a[0];
        for(i=1;i<r;i++)
                   b[i]=b[i-1]+a[i];
        for(i=0;i<r;i++)
                   printf("%c",element[b[i]]);
                   break;
        }
        a[r-1]++;
        for(i=j-1;r-i<r;i--)
                   a[r-i]=1;
printf(",");
    }
    b[0] = a[0];
    for(i=1;i<r;i++)
               b[i]=b[i-1]+a[i];
    for(i=0;i<r;i++)
               printf("%c",element[b[i]]);
    free(element);
    free(a);
    free(b);
    getch();
}




초안 구현 및 문제점
b에 의해 결정되어 출력되는 원소가 해당 위치에서 출력 할 수 있는 가장 상위의 원소일때,
이과정을 최상위부터 내려오며 비교를 하는 문장을 넣지못하여 원하는 결과 값이 출력되지
않았습니다.
최종안
#include <stdio.h>
void main(){
        char input[43];
        char *element;
        int *a, *b;
        int n,r;
        int i,j;


        scanf("%s %d",input,&r);
        n = (strlen(input)-1)/2;
        element = (char *)malloc(n*sizeof(char));
        for (i=0,j=0; i<strlen(input);i++){
                   if(input[i] != ',' && input[i] != '{' && input[i] !='}'){
                              element[j]=input[i];
                              j++;
                   }
        }
        a = (int *)malloc(r*sizeof(int));
        b = (int *)malloc(r*sizeof(int));
        for(i=0;i<r;i++){
                   a[i] = 1;
                   if(i==0)
                              a[i] = 0;
        }
        while(a[0] !=n-r){
        b[0] = a[0];
        for(i=1;i<r;i++)
                   b[i]=b[i-1]+a[i];
        for(i=0;i<r;i++)
                   printf("%c",element[b[i]]);
        for(j=1; ; j++){
                   if(b[r-j] == n-j){
                              a[r-j-1]++;
continue;
                }
                break;
     }
     a[r-1]++;
     for(i=j-1;r-i<r;i--)
                a[r-i]=1;
                printf(",");
     }
     b[0] = a[0];
     for(i=1;i<r;i++)
                b[i]=b[i-1]+a[i];
     for(i=0;i<r;i++)
                printf("%c",element[b[i]]);
     free(element);
     free(a);
     free(b);
     getch();
}


최종안 코딩을 하면서
배열에서 크기를 43으로지정(최대 20개의원소,괄호 2개, 콤마(,)19개)하여 선언하였으며, 입
력받은 문자열에서 원소를 뽑아 동적할당 된 배열에 집어넣었습니다.




프로젝트를 진행하면서..
포인터와 배열에 관해 더 자세하게 알수 있었으며, 조원들끼리 서로 합심하여 모두 적극적
으로 참여 한 결과 프로젝트가 성공적으로 완성되었습니다.
조원들의 적극적인 참여가 일의 능률향상에 도움이 된다는것을 새삼 느꼈으며 조별활동의
장점을 새로 느낄 수 있었습니다.

이산수학 C1 프로젝트 3

  • 1.
    이산치 수학 K-Combination C1조 조원 : 박구남,정준용,민영지,최고봉
  • 2.
    1. 조원별 업무분담 박구남 최종 보고서 작성 및 프로젝트 총괄 정준용 알고리즘에 대한 소스 구현 및 코딩 작업 최고봉 알고리즘에 대한 소스 구현 및 코딩 작업 민영지 K-Combination에 대한 자료조사 및 다른 K-sample등 자료조사 2. 일정 4/9 각 조원들 역할분담 및 자료조사 4/16 초안 검토 및 K-Combination에 관하여 토의 4/18 최종안 확인 및 보고서 작성
  • 3.
    3. 자료 조사 원소의 순서 순서 유관 순서 무관 원소의 반복 k-permutation k-combination 비 반복 추출 (k-순열) (k-조합) 반복 추출 k-sample k-selection 중복 원소 추출 pattern partition k - sample 집합 S로부터 k개를 선택하는 작업 중 하나. 반복을 허락하지만, 다른 순서의 독같은 원소는 목록에서 구별된다. k - selection 집합 S로부터 k개를 선택 할 경우 반복은 허락하지만, 순서에 상관 없이 같은 원소는 동일 하게 취급하는데, 이 경우의 목록을 집합 S로부터의 k - selection라고 한다. k - permutations 집합 S로부터 k개를 선택하는데 반복은 허락하지 않는다. 하지만 선택된 원소들의 순서는 목록에서 구별한다. n개의 원소를 가진 집합으로부터 k-순열의 수는 P(n,k)혹은 nPk라는 기호를 사용한다. k - combinations
  • 4.
    집합 S로부터 k개를선택하는데 반복을 허락하지 않고 순서에 상관없이 구성. 이 같은 원소는 똑같이 취급하는 경우의 목록을 k-조합(K-Combination)라고 한다. 집합 S의 k-조합은 S의 부분 집합과 정확히 일치한다. k-조합의 수는 C(n,k)혹은 nCk라는 기호를 사용한다. 초안 #include <stdio.h> void main(){ char input[43]; char *element; int *a, *b; int n,r; int i,j; scanf("%s %d",input,&r); n = (strlen(input)-1)/2; element = (char *)malloc(n*sizeof(char)); for (i=0,j=0; i<strlen(input);i++){ if(input[i] != ',' && input[i] != '{' && input[i] !='}'){ element[j]=input[i]; j++; } } a = (int *)malloc(r*sizeof(int)); b = (int *)malloc(r*sizeof(int)); for(i=0;i<r;i++){ a[i] = 1; if(i==0) a[i] = 0; } while(a[0] !=n-r){ b[0] = a[0]; for(i=1;i<r;i++) b[i]=b[i-1]+a[i]; for(i=0;i<r;i++) printf("%c",element[b[i]]); break; } a[r-1]++; for(i=j-1;r-i<r;i--) a[r-i]=1;
  • 5.
    printf(","); } b[0] = a[0]; for(i=1;i<r;i++) b[i]=b[i-1]+a[i]; for(i=0;i<r;i++) printf("%c",element[b[i]]); free(element); free(a); free(b); getch(); } 초안 구현 및 문제점 b에 의해 결정되어 출력되는 원소가 해당 위치에서 출력 할 수 있는 가장 상위의 원소일때, 이과정을 최상위부터 내려오며 비교를 하는 문장을 넣지못하여 원하는 결과 값이 출력되지 않았습니다.
  • 6.
    최종안 #include <stdio.h> void main(){ char input[43]; char *element; int *a, *b; int n,r; int i,j; scanf("%s %d",input,&r); n = (strlen(input)-1)/2; element = (char *)malloc(n*sizeof(char)); for (i=0,j=0; i<strlen(input);i++){ if(input[i] != ',' && input[i] != '{' && input[i] !='}'){ element[j]=input[i]; j++; } } a = (int *)malloc(r*sizeof(int)); b = (int *)malloc(r*sizeof(int)); for(i=0;i<r;i++){ a[i] = 1; if(i==0) a[i] = 0; } while(a[0] !=n-r){ b[0] = a[0]; for(i=1;i<r;i++) b[i]=b[i-1]+a[i]; for(i=0;i<r;i++) printf("%c",element[b[i]]); for(j=1; ; j++){ if(b[r-j] == n-j){ a[r-j-1]++;
  • 7.
    continue; } break; } a[r-1]++; for(i=j-1;r-i<r;i--) a[r-i]=1; printf(","); } b[0] = a[0]; for(i=1;i<r;i++) b[i]=b[i-1]+a[i]; for(i=0;i<r;i++) printf("%c",element[b[i]]); free(element); free(a); free(b); getch(); } 최종안 코딩을 하면서 배열에서 크기를 43으로지정(최대 20개의원소,괄호 2개, 콤마(,)19개)하여 선언하였으며, 입 력받은 문자열에서 원소를 뽑아 동적할당 된 배열에 집어넣었습니다. 프로젝트를 진행하면서.. 포인터와 배열에 관해 더 자세하게 알수 있었으며, 조원들끼리 서로 합심하여 모두 적극적 으로 참여 한 결과 프로젝트가 성공적으로 완성되었습니다. 조원들의 적극적인 참여가 일의 능률향상에 도움이 된다는것을 새삼 느꼈으며 조별활동의 장점을 새로 느낄 수 있었습니다.