SlideShare a Scribd company logo
1 of 18
Download to read offline
project #3 -   이산수학




How fast can we sort?




                           D0조

                      조장 11 김슬기
                      조원 09 허규준
                         11 김정무
                         11 김종진
                         11 정민정
-목차-
-조원들의 업무 분담
-일정
-회의록
-기본자료
-과제1
-소스 초안
-문제점 & 해결방안
-최종소스
-참고문헌 및 출처
<조원들의 업무 분담>

 이름                   맡은 업무

11 김슬기      조장 : 보고서 작성, 자료 조사 및 일정 계획

09 허규준          프로그램 설계 및 알고리즘 구상

11 김정무         관련 자료 조사 및 과제1 정리, 작성

11 김종진         관련 자료 조사 및 알고리즘 정리

11 정민정          회의록 작성 및 관련 자료 조사




             <일정>

4월 9일          업무 분담 및 주제와 학습목표 이해




4월 11일         자료 수집 및 알고리즘 초안 논의




4월 18일      과제1 최종 논의 및 프로그램 설계 문제점 파악




4월 20일         최종 프로그램 설계 및 보고서 작성
<회의록>

회의일시   2012년 4월 9일(월)                 조     D0            작성자   11정민정

참석자    09허규준, 11김정무, 11김종진, 11김슬기, 11정민정




       내용                                                 비고




       1.조원별 업무분담
       조장을 정하고, 프로그램 초안 담당 1명, 관련된 기본 자료 조사 및 문제 1,2,3
       풀이 담당 3명으로 업무를 분담하였다.
       2.일정 계획
       다음 회의 시간까지 각자 자신이 맡은 부분을 조사하고 그에 대한 토의를 하기로
       하였다.
회의내용   3.알고리즘 계획
       이전에 나왔던 과제인 멱집합을 구하는 소스를 응용하여 이번 과제를 해결하기
       위한 기본적인 알고리즘과 소스 초안을 구상하기로 하였다.
       4.문제 해결 계획
       방법 1, 2, 3을 각자 하나씩 맡아 문제의 답과 해결 과정, 문제 풀이에 필요한 기
       본적인 개념들을 조사해오기로 했다.
회의일시   2012년 4월 18일(수)                조    D0          작성자   11정민정

참석자    09허규준, 11김정무, 11김종진, 11김슬기, 11정민정




       내용                                              비고



       1.조원별 업무 파악
       조원들이 각자 문제를 하나씩 맡아 새로운 관점에서 다시 문제 풀이를 하기로 하
       였다.


       2.일정 확인
       자료조사 및 프로그램 설계가 거의 완료되었으므로 마감 시간까지 각자의 개인
       소집단 보고서와 조사한 내용들을 모으기로 했다.


       3.자료 및 정보 교환/문제점 파악/해결법 토의
       예전 소스에서 발견한 문제점을 해결하기위해 새로 구상한 프로그램 소스에 대해
회의내용
       그 전 소스를 어떻게 보완하였으며 어떤 알고리즘으로 작동하는 가에 대한 공부
       를 했다.
       또한 방법 1,2,3에 대해 수업시간에 용어 설명을 듣고 새로운 개념을 추가하여
       조원들이 생각하고 있던 방법이 아닌 새로운 관점으로 다시 해결책을 찾기 위해
       토의했다.
       4.보고서 토의
       개인 소집단 보고서와 자료조사내용과 그 출처, 프로그램 소스 초안과 확정된 프
       로그램 소스, 그리고 방법 1,2,3에 대한 새로운 문제 풀이를 추가하여 보고서를
       만들기로 결정했다.
<기본자료>
셈의 기본 원리 (The Fundamental Principle of Counting)

여러 개의 subexperiment가 있고, 각각의 subexperiment들을 모두 수행했을 때, 가능한
outcome의 가지 수는 각 subexperiment의 outcome의 곱이다.
쉽게 말하자면 어떤 것을 N1가지 방법으로 셀 수 있고, 그 후에 다른 것을 N2가지 방법
으로 셀 수 있다면 이 순서대로 셀 수 있는 방법은 N1 * N2가지이다. 이 방법은 그 이상
으로도 확장할 수 있어서 첫 번째의 것은 N1가지 방법으로, 두 번째의 것은 N2가지 방법
으로, 세 번째의 것은 N3가지 방법 있다면 이 순서대로 셀 수 있는 전체적 방법의 수는
N1*N2*N3*...이다.


셈의 기본 원리에서 가장 기본이 되는 것은 덧셈원리와 곱셈 원리이다.


- 덧셈 원리
집합A와 집합B가 각각 유한 집합이고 A∩B=ø일 때, |A∪B|=|A|+|B| 이다.


<합 사건 예제>




어느 상자에 스페이드 카드와 하트 카드가 각각 6개씩 들어있는 상자에서 카드를 한 장 꺼
내는 상황을 예로 들었을 때, 이 상자에서 카드 하나를 꺼내는 행위를 하나의 사건이라고
말하며 이 상자에서 카드를 한 장 꺼내는 구분되는 사건의 수는 12가지(스페이드 6가지 +
하트 6가지)가 된다. 여기서 말하는 구분되는 사건이랑 스페이드 1개 있는 카드를 꺼내는
것과 하트 5개 있는 카드를 꺼내는 경우를 말하며 이들 사건은 각각 별개의 사건이며 두
사건은 동시에 일어 날 수 없다.
이 상황에서 관심사건 : 스페이드 1개 있는 카드를 꺼내거나 하트 5개가 있는 카드를 꺼
낸다고 했을 때 이 관심 사건은 합 사건이 된다. 합 사건이라는 것은 관심 있는 사건이 서
로 함께 일어 날 수 없는 사건이다. 즉 관심 사건 중 하나가 일어나면 다른 사건은 반드시
일어나지 않는 사건일 경우 이 관심사건은 합 사건이 된다.
- 곱셈 원리
집합A와 집합B가 각각 유한 집합일 때, |AxB|=|A||B| 이다.


<곱 사건 예제>
스페이드 상자와 하트 상자 두 개가 서로 독립되어 있다. 여기서 독립되어 있다는 뜻은 스
페이드를 꺼내는 사건이 하트를 꺼내는 사건에 어떤 영향도 미칠 수가 없다는 것을 의미한
다. 상자는 두 개가 있고 두 상자 모두에서 카드를 꺼낸다. 위에서의 경우 스페이드 1과 하
트5는 함께 일어날 수 없는 사건이었지만, 현재의 경우에서 두 사건 모두 동시에 일어날 수
있다. 여기서 관심 사건 : 스페이드 한 장과 하트 한 장을 꺼낸다. 이때 스페이드 카드를 꺼
내는 것과 하트를 꺼내는 것은 관심 사건의 일부가 되므로 전체 만들 수 있는 사건의 수는
(스페이드 카드를 꺼낼 때의 사건 수 ) * (하트 카드를 꺼낼 때의 사건의 수) = 6*6 = 36
가지가 된다.
< k-Permutation >

          n개의 서로 다른 object들을 k개만 뽑아서 배열할 때의 가능한 가지 수는




이다. k-순열이라 하고, 이 때 경우의 수를 P(n,k)로 표시한다.




* k-중복 순열(k-permutation with repetition)

- n-원소 집합으로부터 k개의 원소를 선택할 때, 중복을 허용하고 순서를 주면 k-중복 순
열이라 한다.




                           < k-Combinations >

n-원소 집합으로부터 k-원소 부분 집합을 선택하는 것을 k-조합 또는 n-선택-k라고 하며,
이 때 경우의 수를 C(n,k)로 표시한다.
n개의 서로 다른 object 중에서 k개를 선택하는 경우의 수는




와 같다. 




* k-중복 조합(k-combination with repetition)

- n-원소 집합으로부터 k개의 원소를 선택할 때, 중복은 허용하고 순서를 고려하지 않으면
k-중복 조합이라 한다.
< Sampling with Replacement >

n개의 서로 다른 object를 k번 뽑아 나열하되,
뽑았은 것을 다시 뽑을 수 있는 경우에 가능한 방법은 n^k 가지이다.


Sampling은 말 그대로 여러 가지의 가능성 중에서 하나를 고르는 것이며
replacement는 고른 것을 다시 복구시키는 것이다. 즉, 공을 뽑는 행위라면, 그 공을 다시
뽑을 수 있다는 의미다.
이전의 permutation에서 뽑았던 공을 다시 사용할 수 없었다면, 이번엔 뽑았던 공을 다시
사용할 수 있게 되었다면,
각 바구니에는 항상 7가지의 선택권이 주어진다. 따라서 경우의 수는 7^3가지가 된다.
마찬가지로 n개의 outcome을 가진 experiment를 k번 수행하는 경우에도 가능한 방법은
n^k가지이다.




                   <삽입 정렬 Insertion Sort>

아래의 이미지와 같이 해당되는 슬롯의 앞에 존재하는 모든 값과 비교하여 정렬하는 방식.


처음 것과 비교하여 변동이 있으면 일종의 삽입과 같이 그 뒤의 값들은 뒤로 밀어버린다고
생각해도 되고, 혹은 자리만 변경하고 그 뒤로도 계속해서 숫자를 비교하면서 값을 바꾸는
연산으로 생각을 해도 된다.




.
<선택 정렬 Selection Sort>
선택 정렬은 가장 앞의 노드를 기준으로 뒤로 가면서 값을 비교하는 연산을 수행한다.




                <버블 정렬 Bubble Sort>
버블 정렬은 자신과 인접한 노드와 값을 비교하여 정렬을 하는 방식.
<과제 1>
<방법1.>
●가장 큰 수가 나올 때까지 찾아서 이 카드를 테이블 위에 앞면이 위로 오도록 놓는다. 처
음부터 다시 그 다음 큰 수를 찾아서 그 카드 위에 놓는다. 이 과정을 모든 카드를 찾을 때
까지 반복한다. 정렬되었는가? – 내림차순으로 정렬되었다.


●전체 카드를 몇 번 보아야 하는가?
최악의 경우 – 오름차순으로 정렬되었을 경우 -> 20!
최선의 경우 – 내림차순으로 정렬되었을 경우 -> 20


●시간 복잡도는 얼마인가?
O( )




<방법2>
●카드를 두 뭉치로 나눈다. 하나는 첫 수가 1인 것이고 다른 하나는 첫 수가 2인 것이다.
각 뭉치를 방법1을 사용하여 두 번째 수를 정렬한다. 첫 번째 뭉치를 두 번째 뭉치 위에 놓
는다. 정렬되었는가? - 오름차순으로 정렬


●카드의 비교 수는 얼마인가?
최악의 경우 - 오름차순일 때 -> 첫 수가 1인 카드 10! + 첫 수가 2인 카드 10! = 10!*2
최선의 경우 - 내림차수일 때 -> 첫 수가 1인 카드 10 + 첫 수가 2인 카드 10 = 10*2




<방법3>
●카드의 두 번째 수를 이용하여 10개의 뭉치(0~9)로 나눈다. 이제 두 번째 수가 0인 뭉치를
집어서 첫 번째 수를 보고 두 뭉치로 나누고 뒤집어 놓는다. 두 번째 수가 1인 뭉치를 집어
서 다시 첫 번째 수를 보고 두 뭉치로 나누어 앞의 뭉치 위에 뒤집어 놓는다. 모든 카드에
대해 반복한다.


●카드의 비교 횟수는 얼마인가?
2장씩 나누어진 10개의 뭉치들을 각각 비교 -> 10번
<소스 초안>
#include<stdio.h>


int main(void)
{
        char s[20],c,cnt=0;
        int i,len,j,sp=0,sp2=0,sp3=0;


        for(;;)
        {
                  c=getchar();


                  if((c>=65&&c<=90)||(c>=97&&c<=122)||(c>=49&&c<=57))
                  {
                           s[cnt]=c;
                           cnt=cnt+1;
                  }


                  if(c==' ')
                           break;
        }


        scanf("%d",&len);


        if(len==1)
        {
                  for(i=0;i<cnt;i++)
                  {
                           printf("%c",s[i]);
                                    if(i==cnt-1)
                                    {
                                            break;
                                    }
                           printf(",");
                  }
        }
if(len==2)
{
        sp2=sp+1;
        for(;;)
        {
                  printf("%c",s[sp]);
                  printf("%c",s[sp2]);
                  sp2++;



                  if(sp2==cnt)
                  {
                           sp++;
                           sp2=sp+1;
                  }
                  if(sp==cnt-1)
                  {
                           break;
                  }
                  printf(",");


        }
}


if(len!=1&&len!=2)
{
        sp2=sp+1;
        sp3=len-1;
        for(;;)
        {
                  printf("%c",s[sp]);


                  for(i=sp2;i<sp2+len-2;i++)
                  {
                           printf("%c",s[i]);
                  }


                  printf("%c",s[sp3]);
                  sp3++;
if(sp3==cnt)
                {
                         sp2++;
                         sp3=sp2+len-2;
                }
                if(sp2+len-2==cnt)
                {
                         sp++;
                         sp2=sp+1;
                         sp3=sp2+len-2;
                }


                if((cnt-len)+1==sp)
                {
                         break;
                }
                printf(",");


            }
    }




    return 0;
}
<문제점 및 해결 방안>
지난 프로젝트에 사용한 멱집합 소스를 응용하여 이번 프로젝트 소스
를 짜려고 해 보았으나, 입력 원소 하나하나를 체크하면서 출력 또는
결과 값에 저장을 하는 과정에서 재귀함수를 사용하지 않았다.
재귀 함수 없이 원소를 하나씩 체크하기에는 무리가 있었다.
재귀 함수를 사용한 부분집합 소스를 응용하여 알고리즘을 다시 구상
하였다.
<최종 소스>

#include <stdio.h>



void Rprint(char result[], int n,char string[],int cnt)
{
    int i;
    for(i=0; i < n; i++) {
         printf("%c",result[i]);


    }
         if(result[0]!=string[cnt-n])
                  {
                          printf(",");
                  }
}



void combination(char result[], int n, int n2, char string[], int cnt,int CNT)
{
    if(n2 == n) {
         Rprint(result,n,string,cnt);


    }
    else if(n-n2 <= cnt){
         int i;


         for(i=0; i < cnt; i++)
         {
              result[n2] = string[i];
              combination(result,n,n2+1,string+i+1,cnt-i-1,cnt);
         }
    }
}
int main()
{
    char result[26];
    char string[26];
    int m, n,c,i,cnt=0;


        for(;;)
        {
                  c=getchar();
                  if((c>=65&&c<=90)||(c>=97&&c<=122)||(c>=49&&c<=57))
                  {
                           string[cnt]=c;
                           cnt=cnt+1;
                  }
                  if(c==' ')
                  {
                           break;
                  }
        }


    scanf("%d",&n);


    combination(result,n,0,string,cnt,cnt);
}
<참고문헌 및 출처>
참고자료
이산 수학론(임해철, 정균락 공동저) p282~p291
http://ergate.tistory.com/320
http://blog.naver.com/PostView.nhn?blogId=redwave102&logNo=80073404467&categor
yNo=120&parentCategoryNo=120&viewDate=&currentPage=13&postListTopCurrentPa
ge=&userTopListOpen=true&userTopListCount=5&userTopListManageOpen=false&use
rTopListCurrentPage=13
http://blog.naver.com/PostView.nhn?blogId=redwave102&logNo=80073417047&categor
yNo=120&parentCategoryNo=120&viewDate=&currentPage=13&postListTopCurrentPa
ge=&userTopListOpen=true&userTopListCount=5&userTopListManageOpen=false&use
rTopListCurrentPage=13
http://blog.naver.com/PostView.nhn?blogId=redwave102&logNo=80072462432&categor
yNo=120&parentCategoryNo=120&viewDate=&currentPage=13&postListTopCurrentPa
ge=&userTopListOpen=true&userTopListCount=5&userTopListManageOpen=false&use
rTopListCurrentPage=13


셈의 기본 원리
http://blastic.tistory.com/159


소스 참고 URL
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=72566594&qb=Y+y
WuOyWtCDrtoDrtoTsp5Htlak=&enc=utf8&section=kin&rank=1&search_sort=0&spq=0&
pid=gHaf935Y7v4sstSa/thssc--010377&sid=T5FS91gmkU8AABVF5aY

More Related Content

What's hot

자료구조 Project6
자료구조 Project6자료구조 Project6
자료구조 Project6KoChungWook
 
자료구조 프로젝트
자료구조 프로젝트자료구조 프로젝트
자료구조 프로젝트hyungoh kim
 
목적이 부여된 에이전트 행동
목적이 부여된 에이전트 행동목적이 부여된 에이전트 행동
목적이 부여된 에이전트 행동Hyosung Jeon
 
이산수학 D1 프로젝트 2
이산수학 D1 프로젝트 2이산수학 D1 프로젝트 2
이산수학 D1 프로젝트 2pkok15
 
이산치4보고서
이산치4보고서이산치4보고서
이산치4보고서KimChangHoen
 
자료구조 02 최종 보고서
자료구조 02 최종 보고서자료구조 02 최종 보고서
자료구조 02 최종 보고서pkok15
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdfkd19h
 
이산치 과제7
이산치 과제7이산치 과제7
이산치 과제7mil23
 
Project#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 HwpProject#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 HwpKimjeongmoo
 
자료구조5보고서
자료구조5보고서자료구조5보고서
자료구조5보고서KimChangHoen
 
Cpp 0x kimRyungee
Cpp 0x kimRyungeeCpp 0x kimRyungee
Cpp 0x kimRyungeescor7910
 
이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7pkok15
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01seonhyung
 

What's hot (15)

자료구조 Project6
자료구조 Project6자료구조 Project6
자료구조 Project6
 
자료구조 프로젝트
자료구조 프로젝트자료구조 프로젝트
자료구조 프로젝트
 
자구3번
자구3번자구3번
자구3번
 
목적이 부여된 에이전트 행동
목적이 부여된 에이전트 행동목적이 부여된 에이전트 행동
목적이 부여된 에이전트 행동
 
이산수학 D1 프로젝트 2
이산수학 D1 프로젝트 2이산수학 D1 프로젝트 2
이산수학 D1 프로젝트 2
 
이산치4보고서
이산치4보고서이산치4보고서
이산치4보고서
 
자료구조 02 최종 보고서
자료구조 02 최종 보고서자료구조 02 최종 보고서
자료구조 02 최종 보고서
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf
 
이산치 과제7
이산치 과제7이산치 과제7
이산치 과제7
 
Project#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 HwpProject#5 최단거리 찾기 D0 Hwp
Project#5 최단거리 찾기 D0 Hwp
 
자료구조5보고서
자료구조5보고서자료구조5보고서
자료구조5보고서
 
이산수학07
이산수학07이산수학07
이산수학07
 
Cpp 0x kimRyungee
Cpp 0x kimRyungeeCpp 0x kimRyungee
Cpp 0x kimRyungee
 
이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01
 

Similar to 3콤비네이션

2012 Dm C3 03
2012 Dm C3 032012 Dm C3 03
2012 Dm C3 03chl132435
 
이산치3보고서
이산치3보고서이산치3보고서
이산치3보고서KimChangHoen
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdfjinwookhong
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdfkd19h
 
2012 Ds B2 02
2012 Ds B2 022012 Ds B2 02
2012 Ds B2 02chl132435
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 HwpKimjeongmoo
 
2012 Dm C2 03
2012 Dm C2 032012 Dm C2 03
2012 Dm C2 03seonhyung
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서KimChangHoen
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdfjinwookhong
 
자료구조1보고서
자료구조1보고서자료구조1보고서
자료구조1보고서KimChangHoen
 
이산치보고서
이산치보고서이산치보고서
이산치보고서mil23
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexityskku_npc
 
고등학생 R&E Python summary for test
고등학생 R&E Python summary for test고등학생 R&E Python summary for test
고등학생 R&E Python summary for testKyunghoon Kim
 

Similar to 3콤비네이션 (20)

2012 Dm C3 03
2012 Dm C3 032012 Dm C3 03
2012 Dm C3 03
 
이산치3보고서
이산치3보고서이산치3보고서
이산치3보고서
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf
 
이산치2번
이산치2번이산치2번
이산치2번
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf
 
2012 Ds B2 02
2012 Ds B2 022012 Ds B2 02
2012 Ds B2 02
 
자료구조05
자료구조05자료구조05
자료구조05
 
자료구조05
자료구조05자료구조05
자료구조05
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 Hwp
 
2012 Dm C2 03
2012 Dm C2 032012 Dm C2 03
2012 Dm C2 03
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf
 
자료구조1보고서
자료구조1보고서자료구조1보고서
자료구조1보고서
 
이산치보고서
이산치보고서이산치보고서
이산치보고서
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexity
 
고등학생 R&E Python summary for test
고등학생 R&E Python summary for test고등학생 R&E Python summary for test
고등학생 R&E Python summary for test
 
자료구조02
자료구조02자료구조02
자료구조02
 
2012 Ds 01
2012 Ds 012012 Ds 01
2012 Ds 01
 
자료구조01
자료구조01자료구조01
자료구조01
 
자료구조01
자료구조01자료구조01
자료구조01
 

More from herojoon1378

More from herojoon1378 (8)

자료구조06
자료구조06자료구조06
자료구조06
 
자료구조04
자료구조04자료구조04
자료구조04
 
자료구조02
자료구조02자료구조02
자료구조02
 
Mst 구하기
Mst 구하기Mst 구하기
Mst 구하기
 
7그룹 코드
7그룹 코드7그룹 코드
7그룹 코드
 
6비트덧셈기
6비트덧셈기6비트덧셈기
6비트덧셈기
 
5통신망에서 길 찾기
5통신망에서 길 찾기5통신망에서 길 찾기
5통신망에서 길 찾기
 
2데이터베이스 시스템
2데이터베이스 시스템2데이터베이스 시스템
2데이터베이스 시스템
 

3콤비네이션

  • 1. project #3 - 이산수학 How fast can we sort? D0조 조장 11 김슬기 조원 09 허규준 11 김정무 11 김종진 11 정민정
  • 2. -목차- -조원들의 업무 분담 -일정 -회의록 -기본자료 -과제1 -소스 초안 -문제점 & 해결방안 -최종소스 -참고문헌 및 출처
  • 3. <조원들의 업무 분담> 이름 맡은 업무 11 김슬기 조장 : 보고서 작성, 자료 조사 및 일정 계획 09 허규준 프로그램 설계 및 알고리즘 구상 11 김정무 관련 자료 조사 및 과제1 정리, 작성 11 김종진 관련 자료 조사 및 알고리즘 정리 11 정민정 회의록 작성 및 관련 자료 조사 <일정> 4월 9일 업무 분담 및 주제와 학습목표 이해 4월 11일 자료 수집 및 알고리즘 초안 논의 4월 18일 과제1 최종 논의 및 프로그램 설계 문제점 파악 4월 20일 최종 프로그램 설계 및 보고서 작성
  • 4. <회의록> 회의일시 2012년 4월 9일(월) 조 D0 작성자 11정민정 참석자 09허규준, 11김정무, 11김종진, 11김슬기, 11정민정 내용 비고 1.조원별 업무분담 조장을 정하고, 프로그램 초안 담당 1명, 관련된 기본 자료 조사 및 문제 1,2,3 풀이 담당 3명으로 업무를 분담하였다. 2.일정 계획 다음 회의 시간까지 각자 자신이 맡은 부분을 조사하고 그에 대한 토의를 하기로 하였다. 회의내용 3.알고리즘 계획 이전에 나왔던 과제인 멱집합을 구하는 소스를 응용하여 이번 과제를 해결하기 위한 기본적인 알고리즘과 소스 초안을 구상하기로 하였다. 4.문제 해결 계획 방법 1, 2, 3을 각자 하나씩 맡아 문제의 답과 해결 과정, 문제 풀이에 필요한 기 본적인 개념들을 조사해오기로 했다.
  • 5. 회의일시 2012년 4월 18일(수) 조 D0 작성자 11정민정 참석자 09허규준, 11김정무, 11김종진, 11김슬기, 11정민정 내용 비고 1.조원별 업무 파악 조원들이 각자 문제를 하나씩 맡아 새로운 관점에서 다시 문제 풀이를 하기로 하 였다. 2.일정 확인 자료조사 및 프로그램 설계가 거의 완료되었으므로 마감 시간까지 각자의 개인 소집단 보고서와 조사한 내용들을 모으기로 했다. 3.자료 및 정보 교환/문제점 파악/해결법 토의 예전 소스에서 발견한 문제점을 해결하기위해 새로 구상한 프로그램 소스에 대해 회의내용 그 전 소스를 어떻게 보완하였으며 어떤 알고리즘으로 작동하는 가에 대한 공부 를 했다. 또한 방법 1,2,3에 대해 수업시간에 용어 설명을 듣고 새로운 개념을 추가하여 조원들이 생각하고 있던 방법이 아닌 새로운 관점으로 다시 해결책을 찾기 위해 토의했다. 4.보고서 토의 개인 소집단 보고서와 자료조사내용과 그 출처, 프로그램 소스 초안과 확정된 프 로그램 소스, 그리고 방법 1,2,3에 대한 새로운 문제 풀이를 추가하여 보고서를 만들기로 결정했다.
  • 6. <기본자료> 셈의 기본 원리 (The Fundamental Principle of Counting) 여러 개의 subexperiment가 있고, 각각의 subexperiment들을 모두 수행했을 때, 가능한 outcome의 가지 수는 각 subexperiment의 outcome의 곱이다. 쉽게 말하자면 어떤 것을 N1가지 방법으로 셀 수 있고, 그 후에 다른 것을 N2가지 방법 으로 셀 수 있다면 이 순서대로 셀 수 있는 방법은 N1 * N2가지이다. 이 방법은 그 이상 으로도 확장할 수 있어서 첫 번째의 것은 N1가지 방법으로, 두 번째의 것은 N2가지 방법 으로, 세 번째의 것은 N3가지 방법 있다면 이 순서대로 셀 수 있는 전체적 방법의 수는 N1*N2*N3*...이다. 셈의 기본 원리에서 가장 기본이 되는 것은 덧셈원리와 곱셈 원리이다. - 덧셈 원리 집합A와 집합B가 각각 유한 집합이고 A∩B=ø일 때, |A∪B|=|A|+|B| 이다. <합 사건 예제> 어느 상자에 스페이드 카드와 하트 카드가 각각 6개씩 들어있는 상자에서 카드를 한 장 꺼 내는 상황을 예로 들었을 때, 이 상자에서 카드 하나를 꺼내는 행위를 하나의 사건이라고 말하며 이 상자에서 카드를 한 장 꺼내는 구분되는 사건의 수는 12가지(스페이드 6가지 + 하트 6가지)가 된다. 여기서 말하는 구분되는 사건이랑 스페이드 1개 있는 카드를 꺼내는 것과 하트 5개 있는 카드를 꺼내는 경우를 말하며 이들 사건은 각각 별개의 사건이며 두 사건은 동시에 일어 날 수 없다. 이 상황에서 관심사건 : 스페이드 1개 있는 카드를 꺼내거나 하트 5개가 있는 카드를 꺼 낸다고 했을 때 이 관심 사건은 합 사건이 된다. 합 사건이라는 것은 관심 있는 사건이 서 로 함께 일어 날 수 없는 사건이다. 즉 관심 사건 중 하나가 일어나면 다른 사건은 반드시 일어나지 않는 사건일 경우 이 관심사건은 합 사건이 된다.
  • 7. - 곱셈 원리 집합A와 집합B가 각각 유한 집합일 때, |AxB|=|A||B| 이다. <곱 사건 예제> 스페이드 상자와 하트 상자 두 개가 서로 독립되어 있다. 여기서 독립되어 있다는 뜻은 스 페이드를 꺼내는 사건이 하트를 꺼내는 사건에 어떤 영향도 미칠 수가 없다는 것을 의미한 다. 상자는 두 개가 있고 두 상자 모두에서 카드를 꺼낸다. 위에서의 경우 스페이드 1과 하 트5는 함께 일어날 수 없는 사건이었지만, 현재의 경우에서 두 사건 모두 동시에 일어날 수 있다. 여기서 관심 사건 : 스페이드 한 장과 하트 한 장을 꺼낸다. 이때 스페이드 카드를 꺼 내는 것과 하트를 꺼내는 것은 관심 사건의 일부가 되므로 전체 만들 수 있는 사건의 수는 (스페이드 카드를 꺼낼 때의 사건 수 ) * (하트 카드를 꺼낼 때의 사건의 수) = 6*6 = 36 가지가 된다.
  • 8. < k-Permutation > n개의 서로 다른 object들을 k개만 뽑아서 배열할 때의 가능한 가지 수는 이다. k-순열이라 하고, 이 때 경우의 수를 P(n,k)로 표시한다. * k-중복 순열(k-permutation with repetition) - n-원소 집합으로부터 k개의 원소를 선택할 때, 중복을 허용하고 순서를 주면 k-중복 순 열이라 한다. < k-Combinations > n-원소 집합으로부터 k-원소 부분 집합을 선택하는 것을 k-조합 또는 n-선택-k라고 하며, 이 때 경우의 수를 C(n,k)로 표시한다. n개의 서로 다른 object 중에서 k개를 선택하는 경우의 수는 와 같다.  * k-중복 조합(k-combination with repetition) - n-원소 집합으로부터 k개의 원소를 선택할 때, 중복은 허용하고 순서를 고려하지 않으면 k-중복 조합이라 한다.
  • 9. < Sampling with Replacement > n개의 서로 다른 object를 k번 뽑아 나열하되, 뽑았은 것을 다시 뽑을 수 있는 경우에 가능한 방법은 n^k 가지이다. Sampling은 말 그대로 여러 가지의 가능성 중에서 하나를 고르는 것이며 replacement는 고른 것을 다시 복구시키는 것이다. 즉, 공을 뽑는 행위라면, 그 공을 다시 뽑을 수 있다는 의미다. 이전의 permutation에서 뽑았던 공을 다시 사용할 수 없었다면, 이번엔 뽑았던 공을 다시 사용할 수 있게 되었다면, 각 바구니에는 항상 7가지의 선택권이 주어진다. 따라서 경우의 수는 7^3가지가 된다. 마찬가지로 n개의 outcome을 가진 experiment를 k번 수행하는 경우에도 가능한 방법은 n^k가지이다. <삽입 정렬 Insertion Sort> 아래의 이미지와 같이 해당되는 슬롯의 앞에 존재하는 모든 값과 비교하여 정렬하는 방식. 처음 것과 비교하여 변동이 있으면 일종의 삽입과 같이 그 뒤의 값들은 뒤로 밀어버린다고 생각해도 되고, 혹은 자리만 변경하고 그 뒤로도 계속해서 숫자를 비교하면서 값을 바꾸는 연산으로 생각을 해도 된다. .
  • 10. <선택 정렬 Selection Sort> 선택 정렬은 가장 앞의 노드를 기준으로 뒤로 가면서 값을 비교하는 연산을 수행한다. <버블 정렬 Bubble Sort> 버블 정렬은 자신과 인접한 노드와 값을 비교하여 정렬을 하는 방식.
  • 11. <과제 1> <방법1.> ●가장 큰 수가 나올 때까지 찾아서 이 카드를 테이블 위에 앞면이 위로 오도록 놓는다. 처 음부터 다시 그 다음 큰 수를 찾아서 그 카드 위에 놓는다. 이 과정을 모든 카드를 찾을 때 까지 반복한다. 정렬되었는가? – 내림차순으로 정렬되었다. ●전체 카드를 몇 번 보아야 하는가? 최악의 경우 – 오름차순으로 정렬되었을 경우 -> 20! 최선의 경우 – 내림차순으로 정렬되었을 경우 -> 20 ●시간 복잡도는 얼마인가? O( ) <방법2> ●카드를 두 뭉치로 나눈다. 하나는 첫 수가 1인 것이고 다른 하나는 첫 수가 2인 것이다. 각 뭉치를 방법1을 사용하여 두 번째 수를 정렬한다. 첫 번째 뭉치를 두 번째 뭉치 위에 놓 는다. 정렬되었는가? - 오름차순으로 정렬 ●카드의 비교 수는 얼마인가? 최악의 경우 - 오름차순일 때 -> 첫 수가 1인 카드 10! + 첫 수가 2인 카드 10! = 10!*2 최선의 경우 - 내림차수일 때 -> 첫 수가 1인 카드 10 + 첫 수가 2인 카드 10 = 10*2 <방법3> ●카드의 두 번째 수를 이용하여 10개의 뭉치(0~9)로 나눈다. 이제 두 번째 수가 0인 뭉치를 집어서 첫 번째 수를 보고 두 뭉치로 나누고 뒤집어 놓는다. 두 번째 수가 1인 뭉치를 집어 서 다시 첫 번째 수를 보고 두 뭉치로 나누어 앞의 뭉치 위에 뒤집어 놓는다. 모든 카드에 대해 반복한다. ●카드의 비교 횟수는 얼마인가? 2장씩 나누어진 10개의 뭉치들을 각각 비교 -> 10번
  • 12. <소스 초안> #include<stdio.h> int main(void) { char s[20],c,cnt=0; int i,len,j,sp=0,sp2=0,sp3=0; for(;;) { c=getchar(); if((c>=65&&c<=90)||(c>=97&&c<=122)||(c>=49&&c<=57)) { s[cnt]=c; cnt=cnt+1; } if(c==' ') break; } scanf("%d",&len); if(len==1) { for(i=0;i<cnt;i++) { printf("%c",s[i]); if(i==cnt-1) { break; } printf(","); } }
  • 13. if(len==2) { sp2=sp+1; for(;;) { printf("%c",s[sp]); printf("%c",s[sp2]); sp2++; if(sp2==cnt) { sp++; sp2=sp+1; } if(sp==cnt-1) { break; } printf(","); } } if(len!=1&&len!=2) { sp2=sp+1; sp3=len-1; for(;;) { printf("%c",s[sp]); for(i=sp2;i<sp2+len-2;i++) { printf("%c",s[i]); } printf("%c",s[sp3]); sp3++;
  • 14. if(sp3==cnt) { sp2++; sp3=sp2+len-2; } if(sp2+len-2==cnt) { sp++; sp2=sp+1; sp3=sp2+len-2; } if((cnt-len)+1==sp) { break; } printf(","); } } return 0; }
  • 15. <문제점 및 해결 방안> 지난 프로젝트에 사용한 멱집합 소스를 응용하여 이번 프로젝트 소스 를 짜려고 해 보았으나, 입력 원소 하나하나를 체크하면서 출력 또는 결과 값에 저장을 하는 과정에서 재귀함수를 사용하지 않았다. 재귀 함수 없이 원소를 하나씩 체크하기에는 무리가 있었다. 재귀 함수를 사용한 부분집합 소스를 응용하여 알고리즘을 다시 구상 하였다.
  • 16. <최종 소스> #include <stdio.h> void Rprint(char result[], int n,char string[],int cnt) { int i; for(i=0; i < n; i++) { printf("%c",result[i]); } if(result[0]!=string[cnt-n]) { printf(","); } } void combination(char result[], int n, int n2, char string[], int cnt,int CNT) { if(n2 == n) { Rprint(result,n,string,cnt); } else if(n-n2 <= cnt){ int i; for(i=0; i < cnt; i++) { result[n2] = string[i]; combination(result,n,n2+1,string+i+1,cnt-i-1,cnt); } } }
  • 17. int main() { char result[26]; char string[26]; int m, n,c,i,cnt=0; for(;;) { c=getchar(); if((c>=65&&c<=90)||(c>=97&&c<=122)||(c>=49&&c<=57)) { string[cnt]=c; cnt=cnt+1; } if(c==' ') { break; } } scanf("%d",&n); combination(result,n,0,string,cnt,cnt); }
  • 18. <참고문헌 및 출처> 참고자료 이산 수학론(임해철, 정균락 공동저) p282~p291 http://ergate.tistory.com/320 http://blog.naver.com/PostView.nhn?blogId=redwave102&logNo=80073404467&categor yNo=120&parentCategoryNo=120&viewDate=&currentPage=13&postListTopCurrentPa ge=&userTopListOpen=true&userTopListCount=5&userTopListManageOpen=false&use rTopListCurrentPage=13 http://blog.naver.com/PostView.nhn?blogId=redwave102&logNo=80073417047&categor yNo=120&parentCategoryNo=120&viewDate=&currentPage=13&postListTopCurrentPa ge=&userTopListOpen=true&userTopListCount=5&userTopListManageOpen=false&use rTopListCurrentPage=13 http://blog.naver.com/PostView.nhn?blogId=redwave102&logNo=80072462432&categor yNo=120&parentCategoryNo=120&viewDate=&currentPage=13&postListTopCurrentPa ge=&userTopListOpen=true&userTopListCount=5&userTopListManageOpen=false&use rTopListCurrentPage=13 셈의 기본 원리 http://blastic.tistory.com/159 소스 참고 URL http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=72566594&qb=Y+y WuOyWtCDrtoDrtoTsp5Htlak=&enc=utf8&section=kin&rank=1&search_sort=0&spq=0& pid=gHaf935Y7v4sstSa/thssc--010377&sid=T5FS91gmkU8AABVF5aY