49

2012 Dm B3 보고서(06박찬흥)

  • Upload
    pchmago

  • View
    173

  • Download
    3

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: 2012 Dm B3 보고서(06박찬흥)
Page 2: 2012 Dm B3 보고서(06박찬흥)

의 내용을reflexive, symmetric, irreflexive

숙지하여 이것을 이용한 프로그램을 만드는 것이 이번 프로젝트의 목표입니다.

이번 프로젝트를 진행하게 된 배경은 먼저 이산치 수학의 관계에서부터 시작하게 되었습니다.

관계란 네이버의 사전의 정의에 의하면 여러 가지 뜻을 가지고 있으나 그중에 대표적인 것으로는 둘* ? “

이상의 사람 사물 현상 따위가 서로 관련을 맺거나 관련이 있음 또는 그런 관련 으로 정의 되어있다 즉, , . .” . ,

수학에서 말하는 관계라 하면 둘 이상의 집합이 서로 관계 되는 것을 말한다 이러한 관계 중에서 이번.

프로젝트에서 중점을 둔 관계는 이항 관계에 대한 것입니다.

이항관계 이란 집합 와 집합 가 존재 할 때 에서 로의 이항관계 은 의* (binary relation) ? A B , A B R AXB

부분집합 즉 가 에 속할 때. ,(x,y) R , x is related to y by R.

로 정의되어 있다 이 말은 는 이므로 이것은 집합일 때 성립하는 것으로 이항 관계는. AXB Cartesian Product

집합론만을 가지고 정의 될수 있다고 ‘

에 대하여 가A xRx

성립하고 즉 각원소가 자기 자신과 관계있을때를 칭함 이 대칭성 이면 모든 의 원소( , ), R (symmetric) A

에 대하여 이면 가 성립한다x,y A , xRy yRx .

즉 이것은 한원소가 두 번째 원소와 관계에 있다면 거꾸로도 성립함 그리고 이행성 은 모든( , ) transitive( )

에 대해 이고 이면 가 성립하는 것을 말한다 즉 원소가 원소가 관계있고 원소와x,y A ,xRy yRz xRz .( , 1 2 , 2

원소가 관계있다면 원소와 원소가 관계있다 이것은 다음 그림을 보던 더 자세히 알 수 있다3 , 1 3 .) .

Page 3: 2012 Dm B3 보고서(06박찬흥)
Page 4: 2012 Dm B3 보고서(06박찬흥)

일정 수요일03.14( )

회의

내용.

http://air.changwon.ac.kr/wp-content/uploads/2012/01/02-relation-

function.pdf

위의 내용이 이번 과제의 문제와 학습할 내용이 포함된 자료인데,

서로의 업무를 분담하기 전에 각자 자료를 조사한 후에 이번 주

토요일 까지 각자 자료를 조사하기로 결정하였다.

이 내용을 토대로 알수 있는 것은 만약 대칭성을 가진 자료를

테이블에서 추출 해내서 새로운 테이블로 합치려고 할 때 이

프로그램을 토대로 사용하면 하나의 새로운 테이블을 생성 할수(Join)

있다는 것을 토의를 통해 알게 되었다.

회의결과및토의

다음 모임 까지 이번 과제의 학습내용에 대한 정리와 어떤 식으로 보고서를 정리 할 것 인지에 대해서 조사해 오기로 결정하였다.

일정 토요일03.17( )

회의

내용.

문제 파악과 학습내용의 자료 노트정리자료 참조 를 토대로 크게( )

팀으로 나누기로 결정하였는데 프로그래밍 팀과 조사팀으로 나누기로2

결정을 하였다.

여기서 프로그래밍 팀의 박찬흥 팀원이 알고리즘을 행렬로 바로

받아서 이번 프로그램을 만들어 보겠다고 하였고 조장인 윤정현이,

책의 자료를 조사한 것을 보고 차원 배열로 받아 집합을 증명하는1

방법으로 하는 것으로 토의 하였었는데 그렇게 해서 함수를 받으면.

오히려 프로그램을 만드는 것에 대해서 조금더 복잡해질수도 있다는

것을 프로그래밍 팀에서 말을 해주었고 그래서 결국 행렬에서,

문자열로 받아서 차원 배열로 만드는 식으로 알고리즘을 짜는 것으로2

결정을 내리게 되었다 그리고 조사팀에서는 학습내용에 관한 문제를.

찾고 항 관계와 관계 데이터 베이스 시스템에 대해서 간단히 조사해, N

오는 것으로 결정하였다.

Page 5: 2012 Dm B3 보고서(06박찬흥)

회의결과및토의

알고리즘은 입력값을 받고 바로 입력 받은 값을 비교하는 소-스로 만들기로 결정하였습니다.조사팀에서는 학습내용에 관한 예시 문제와 항 관계와 데이- N터 베이스 시스템에 대한 관계에 대해서 조사하기로 결정하였습니다.

일정 월요일03.19( )

회의

내용.

Page 6: 2012 Dm B3 보고서(06박찬흥)

회의결과및토의

다음번 모임 때 까지 프로그램의 소스 보완점을 찾고 보고서- ,내용을 정리 하는 것으로 결정 하였습니다.함수에 대한 내용 정리를 해서 같이 공부하는 것으로 결정하-였습니다.

일정 금요일03.23( )

회의

내용.

Page 7: 2012 Dm B3 보고서(06박찬흥)
Page 8: 2012 Dm B3 보고서(06박찬흥)

라는 라벨을 이용해서 문을 사용해서 나가는 방식을-OUTT goto

이용해 출력 구문의 크기를 줄이기로 결정하였습니다.

그리고 함수에 관한 학습내용은-

회의결과및토의

프로그램 실행시 입력부분은 과 같이 프로젝트[[0,1][0,0,1][1,0]]문제와 같은 방식으로 문자를 입력하게 하였고 그 결과로 나오는 것으로 만들어 졌다.출력 부분은 프로젝트 과제의 목표와 같이 만들어 졌으며,위의 소스 설명처럼 정방 행렬이 아니면 반사성 와 비(reflexive)반사성 가 를 출력하는 형식으로 만들게 되었습니(irreflexive) no다.

Page 9: 2012 Dm B3 보고서(06박찬흥)

문장

Page 10: 2012 Dm B3 보고서(06박찬흥)
Page 11: 2012 Dm B3 보고서(06박찬흥)
Page 12: 2012 Dm B3 보고서(06박찬흥)

조 이산치 수학B3

과제 보고서

[Project #3 : How fast can we sort?]

조장 최완철:

조원 박찬흥:

김재찬

정의수

백지원

Page 13: 2012 Dm B3 보고서(06박찬흥)

과제수행일지과제수행일지과제수행일지과제수행일지소속 조원

A3 조장 최완철: 자료조사 정의수 백지원: , 프로그래밍 박찬흥:과제수행기간 일3

계획의 작성I.

연구제목 Sorting

연구배경학습한 내용에 대해 이해를 하고 의 정의를 알고 이것을 프로그램으, k-combination ,로 만들어 봄으로써 활용법을 안다.

참고자료

참고 서적

이산수학 및 응용 지음 임은기 김환구 안동언 이주영/Susanna S.Epp / , , , ,정태충 차운옥 최종민 허성우 옮김, , ,이산수학 제 판 지음 강흥식 김정인 박창현 이6 /Richard Johnsonbaugh / , , ,명재 옮김

참고 URL

http://www.ktword.co.kr/abbr_view.php?m_temp1=4065&mgid=145의 용어에 대한 의미와 공식-> k-combination

http://www.ktword.co.kr/abbr_view.php?nav=&m_temp1=4123&mgid=424

에 관한 설명-> Permutation계획의 실행II.

첫째 날 년 월 일 월요일2012 4 9오늘의 작업 조원의 업무 분담과 학습할 내용 및 과제에 대한 이해와 숙지

토의 내용

조장 최완철:자료조사 정의수 백지원: ,프로그래밍 박찬흥:

위와 같이 조원의 업무 분담을 하였으며 번째 과제와 관련된 순열 조합을 중심으로3 ,프로그래밍 과제에 대한 내용을 인식하고 개별적으로 분담을 해서 조사를 하고 이해를해 온 다음 그것을 조원들에게 설명해주는 것으로 방향을 잡았다.

과제준비에서

느낀 점

조편성을 모르다가 수업이후 따로 모여 각자의 역할을 정하면서 미리 준비하지 못했던,만큼의 역할에 대한 책임감을 갖게 되었다.

Page 14: 2012 Dm B3 보고서(06박찬흥)

둘째 날 년 월 일 토요일2012 4 14오늘의 작업 학습할 내용에 대한 설명 및 이해

토의 내용

경우의 수 과제를 수행하기 위해서는 가장 먼저 이해해야 할 k-permutation,을 중심적으로 설명을 하였다k-combination, k-sample, k-selection .

원소의 순서

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

비 반복 추출k-permutation

순열(k- )

k-combination

조합(k- )

반복 추출 k-sample k-selection

k-permutation순열에서는 집합 로부터 개를 선택하는데 반복을 허락하지 않는다 하지만 선택된k- S k .

원소들의 순서는 목록에서 구별한다 이 목록을 집합 로부터의. S 순열순열순열순열k-k-k-k-(k-permutations)(k-permutations)(k-permutations)(k-permutations)이라고 부른다.k-combination

집합 로부터 개를 선택하는데 반복을 허락하지 않고 순서에 상관없이 구성이 같은S k ,원소는 똑같이 취급하는 경우의 목록을 조합조합조합조합k- (k-combinations)k- (k-combinations)k- (k-combinations)k- (k-combinations)라고 한다 집합 의. S

조합은 의 부분 집합과 정확히 일치한다k- S .k-sample

는 집합 로부터 개를 선택하는 작업중 하나이다 반복을 허락하지만 다른k-samples S k . ,순서의 똑같은 원소는 목록 에서 구별된다 이런 종류의 목록을(list) . k-samplek-samplek-samplek-sample이라고부른다.k-selection

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

는 여러 번 동전 던지기의 결과를 알아보기 등에 유용하다k-selections .

과제준비에서

느낀 점

순열과 조합이라는 과목은 중 고등과정에서 배운 것이었지만 단순히 공식을 외워서 문, ,제풀이만 했다는 것을 느꼈다.이번 회의를 진행하면서 가장 기본이 되지만 평소에는 생각을 그다지 하지 않는 이론,적이고 원론적인 것에 대하여 알게 되어 많은 생각을 해보게 되었다.

셋째 날 년 월 일 월요일2012 4 16오늘의 작업 과제 풀이 및 과제 알고리즘 작성1 2

토의 내용

강의시간동안 과제 에 대하여 조원 모두 문제를 해결해보았고 과제 에 대해서는 알고1 , 2리즘을 작성해보면서 해결방법을 모색해보았다.

위의 전제를 통해 관계 찾기 과제의 알고리즘을 작성하였다.

Page 15: 2012 Dm B3 보고서(06박찬흥)

행렬 입력

입력받은 행렬을 관계행렬의 형태로 출력

행과 열이 같은 경우 에 대한 구분(2x2,3x3,4x4,5x5)

중 선택하는 부분 출력YES=reflexive, symmetric, irreflexive

가 전부 로 출력NO=reflexive, symmetric, irreflexive NO

중 선택하면 그 관계에 대한 결과가 으로 출력reflexive, symmetric, irreflexive Y/N

프로그램 종료

과제준비에서

느낀 점

이산치수학 과제를 하다보면 소스코딩에 치중하는 경항이 강한데 소스코딩보다 관련된,문제를 해결해봄으로써 그 해결법을 참고하거나 이용하면 보다 수월하게 소스코딩을,할 수 있다는 것을 느꼈다.

넷째 날 년 월 일 화요일2012 4 17오늘의 작업 관계 찾기 과제의 프로그램 소스 초안 코딩

초안

#include <stdio.h>

#include <stdlib.h>

struct powerset{

char com;

};

int Reflexive(int *arr,int x);

int Symmetric(int *arr,int x);

int Irreflexive(int *arr,int x);

typedef struct powerset ps;

int main(){

ps *set;

int i=0,j=1,x=0,y=0,z=0,a=0;

집합을 입력하시오printf(" : ");

set = (ps *)malloc(sizeof(ps));

for(;;){

scanf("%c", &set[i].com);

는 건너띔if(set[i].com == 91 || set[i].com == 44) continue; // "["

if(set[i].com == 93){

if (y==0) x=i;

Page 16: 2012 Dm B3 보고서(06박찬흥)

y++;

continue;

}

를 입력받으면 반복문 탈출if(set[i].com == 10) break; // "Enter"

i++;

}

좌표 좌표// x=x , y=y

y--;

printf("%d %d\n",x,y);

char Temp[i];

면 모두 성립하지 않으므로 출력후 종료if(x != y){ // x != y NO

printf("reflexive, symmetric, irreflexive = NO!");

scanf("%c", &set[i].com);

return 0;

}

입력한 크기의 배열 지정int arr[x][y]; //

for (i=0 ; i<y ; i++){

for (j=0 ; j<x ; j++){

if (set[z].com == 44) z++;

Temp[a] = set[z].com;

arr[i][j] = atoi(Temp);

a=0;

}

}

여기까지 입력부//

여기부터 출력부//

입력한 집합은printf(" \n");

for (i=0 ; i<y ; i++){

for (j=0 ; j<x ; j++){

printf("%d ",arr[i][j]);

}

printf("\n");

}

입니다 확인을 하고자 하는 옵션의 숫자를 입력해 주십시오printf(" .\n .\n 1.reflexive\n

2.symmetric\n 3.irreflexive\n");

scanf("%d", &i);

switch (i){

case 1:

j = Reflexive(arr,x);

break;

case 2:

j = Symmetric(arr,x);

Page 17: 2012 Dm B3 보고서(06박찬흥)

break;

case 3:

j = Irreflexive(arr,x);

break;

default:

올바르지 않는 입력입니다printf(" .\n");

break;

}

if (j==1) printf("%YES!");

if (j==0) printf("%NO!");

환경 상 결과를 보려면 이것을 써줘야 함scanf("%d", &set[i].com); //dev

return 0;

}

int Reflexive(int *arr,int x){

return 0;

}

int Symmetric(int *arr,int x){

return 0;

}

int Irreflexive(int *arr,int x){

return 0;

}

문제점 함수에서 사용한 차원 배열이 제대로 기능이 되지 않아 오류가 났다2 .

해결 방안 함수로 따로 뺀 차원 배열을 바로 메인 함수에 넣기로 하였다2 .

다섯째 날 년 월 일 수요일2012 4 18오늘의 작업 관계 찾기 과제의 프로그램 소스 초안에 대한 문제점 해결

안2

#include <stdio.h>

#include <stdlib.h>

struct powerset{

char com;

};

typedef struct powerset ps;

int main(){

ps *set;

int i=0,j=1,x=0,y=0,z=0,a=0,b=0,c=0;

집합을 입력하시오printf(" : ");

set = (ps *)malloc(sizeof(ps));

Page 18: 2012 Dm B3 보고서(06박찬흥)

for(;;){

scanf("%c", &set[i].com);

는 건너띔if(set[i].com == 91 || set[i].com == 44) continue; // "["

if(set[i].com == 93){

if (y==0) x=i;

y++;

continue;

}

를 입력받으면 반복문 탈출if(set[i].com == 10) break; // "Enter"

i++;

}

좌표 좌표// x=x , y=y

y--;

char Temp[i];

면 모두 성립하지 않으므로 출력후 종료if(x != y){ // x != y NO

printf("reflexive, symmetric, irreflexive = NO!");

scanf("%c", &set[i].com);

return 0;

}

입력한 크기의 배열 지정int arr[x][y]; //

for (i=0 ; i<y ; i++){

for (j=0 ; j<x ; j++){

if (set[z].com == 44)

z++;

for (c=0;c<=3;c++){

Temp[c] = 0;

}

Temp[a] = set[z].com;

arr[i][j] = atoi(Temp);

z++;

a=0;

}

}

여기까지 입력부//

여기부터 출력부//

입력한 집합은printf(" \n");

for (i=0 ; i<y ; i++){

for (j=0 ; j<x ; j++){

printf("%d ",arr[i][j]);

}

printf("\n");

}

for(;;){

입니다 확인을 하고자 하는 옵션의 숫자를 입력해 주십시오printf(" .\n .\n 1.reflexive\n

Page 19: 2012 Dm B3 보고서(06박찬흥)

2.symmetric\n 3.irreflexive\n");

scanf("%d", &i);

switch (i){

case 1:

j=1;

for(b=0;b<x;b++){

if(arr[b][b]==1){

if (j!=0) j=1;

}else{

j=0;

}

}

break;

case 2:

j=1;

for (b=0;b<x;b++) {

for (c=b;c<y;c++) {

if (arr[c][b] != arr[b][c])

j = 0;

}

}

break;

case 3:

j=1;

for(b=0;b<x;b++){

if(arr[b][b]==0){

if (j!=0) j=1;

}else{

j=0;

}

}

break;

default:

올바르지 않는 입력입니다printf(" .\n");

break;

}

if (j==1) printf("YES!");

if (j==0) printf("NO!");

}

종료하시려면 아무키나 눌러주세요printf(" .");

return 0;

}

문제점 결과 출력이 무한 반복되는 문제가 생겼다.

해결방안 헤더와 를 이용하여 결과 출력이 무한 반복되는 문제를 해결하였<conio.h> getch()

Page 20: 2012 Dm B3 보고서(06박찬흥)

다.

결과결과결과결과III.III.III.III.

최종 프로그램

소스

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

struct powerset{

char com;

};

typedef struct powerset ps;

int main(){

ps *set;

int i=0,j=1,x=0,y=0,z=0,a=0,b=0,c=0;

집합을 입력하시오printf(" : ");

set = (ps *)malloc(sizeof(ps));

입력 받기for(;;){ // . [, ]

scanf("%c", &set[i].com);

는 건너띔if(set[i].com == 91 || set[i].com == 44) continue; // "[", ","

if(set[i].com == 93){

if (y==0) x=i;

y++;

continue;

}

를 입력받으면 반복문 탈출if(set[i].com == 10) break; // "Enter"

i++;

}

좌표 좌표// x = x , y = y

y--;

char Temp[i];

면 모두 성립하지 않으므로 출력후 종료if(x != y){ // x != y NO

printf("reflexive, symmetric, irreflexive = NO!");

scanf("%c", &set[i].com);

return 0;

}

입력한 크기의 배열 지정int arr[x][y]; //

형으로 받은 자료를 처리하기 쉽게 형 차원 배열에 입for (i=0 ; i<y ; i++){ // char int 2

력한다.

for (j=0 ; j<x ; j++){

if (set[z].com == 44)

z++;

for (c=0;c<=3;c++){

Temp[c] = 0;

Page 21: 2012 Dm B3 보고서(06박찬흥)

}

Temp[a] = set[z].com;

arr[i][j] = atoi(Temp);

z++;

a=0;

}

}

입력한 집합은printf(" \n");

입력한 자료를 행렬로 띄워준다for (i=0 ; i<y ; i++){ // .

for (j=0 ; j<x ; j++){

printf("%d ",arr[i][j]);

}

printf("\n");

}

입니다 확인을 하고자 하는 옵션의 숫자를 입력해 주십시오printf(" .\n .\n 1.reflexive\n

2.symmetric\n 3.irreflexive\n");

scanf("%d", &i);

여기서 를 판별한다switch (i){ // Yes, No .

를 판별case 1: // reflexive

j=1;

for(b=0;b<x;b++){

if(arr[b][b]==1){

if (j!=0) j=1;

}else{

j=0;

}

}

break;

를 판별case 2: // symmetric

j=1;

for (b=0;b<x;b++){

for (c=b;c<y;c++){

if (arr[c][b] != arr[b][c])

j = 0;

}

}

break;

를 판별case 3: // irreflexive

j=1;

for(b=0;b<x;b++){

if(arr[b][b]==0){

if (j!=0) j=1;

}else{

j=0;

}

Page 22: 2012 Dm B3 보고서(06박찬흥)

}

break;

예외처리default: //

올바르지 않는 입력입니다printf(" .\n");

break;

}

if (j==1) printf("YES!\n");

if (j==0) printf("NO!\n");

종료하시려면 아무키나 눌러주세요printf(" .");

getch();

return 0;

}

결과 출력

일 때의Ex) 3x3 [[1,0,1][1,1,0][0,1,1]] reflexive

반성.Ⅳ

과제를 마치면서

느낀 점

조원의 구성이 랜덤하게 배정되는 만큼 조원 개개인의 분야별 능력도 상이한데 조원의,구성에 따라서 맞춤식으로 각자의 역할을 배분해야 한다는 것을 느꼈고,조원별로 회의 가능한 시간이 각자 달라서 모이려면 주말이나 공휴일을 이용해야 서로가 편했다 하지만 조원 모두가 가능한 각주의 수업시간을 조금 더 잘 활용한다면 주말. ,에 굳이 모이지 않더라도 충분한 토의를 할 수 있었다고 생각되어서 이점이 아쉽다.

기타이산치수학 이라는 과목을 공부한다는 생각보다 소스코딩에 조원들의 신경이 집중되는,점이 아쉬웠다.

Page 23: 2012 Dm B3 보고서(06박찬흥)

조 이산치 수학B3

과제 보고서

[Project #4 :Syntax of languages]

조장 백지원:

조원 박찬흥:

김재찬

정의수

최완철

Page 24: 2012 Dm B3 보고서(06박찬흥)

과제수행일지과제수행일지과제수행일지과제수행일지소속 조원

B3 조장 백지원: 자료조사 정의수 최완철: , 프로그래밍 박찬흥:과제수행기간 일 시간4 8

계획의 작성I.

연구제목연구제목연구제목연구제목 Syntax of languages

연구배경연구배경연구배경연구배경학습한 내용에 대한 이해 및 정의를 자세히 알고, 를Minimum Spanning Tree 프로그램

으로 구성하여 봄으로써 활용법을 안다.

참고자료참고자료참고자료참고자료 참고 서적참고 서적참고 서적참고 서적

이산수학 및 응용 지음 임은기 김환구 안동언 이주영/Susanna S.Epp / , , , ,

정태충 차운옥 최종민 허성우 옮김, , ,

이산수학 제 판 지음 강흥식 김정인 박창현 이6 /Richard Johnsonbaugh / , , ,

명재 옮김

계획의 실행계획의 실행계획의 실행계획의 실행II.II.II.II.

첫째 날첫째 날첫째 날첫째 날 년 월 일 화요일2012 4 24

오늘의 작업오늘의 작업오늘의 작업오늘의 작업 조원의 업무 분담과 학습할 내용 및 과제에 대한 이해와 숙지

토의 내용토의 내용토의 내용토의 내용

조장 백지원:

자료조사 정의수 최완철: ,

프로그래밍 박찬흥:

위와 같이 조원의 업무 분담을 하였으며 번째 과제와 관련된4 를Minimum Spanning Tree

중심으로 프로그래밍 과제에 대한 내용을 인식하고 개별적으로 분담을 해서 조사를 하

고 이해를 해 온 다음 그것을 조원들에게 설명해주는 것으로 방향을 잡았다.

그리고 조원 한 명이 수업을 들어오지 않아 역할 분담에서 제외를 하였다.

과제준비에서과제준비에서과제준비에서과제준비에서

느낀 점느낀 점느낀 점느낀 점

조 편성을 모르다가 수업이후 따로 모여 각자의 역할을 정하면서 미리 준비하지 못했,

던 만큼의 역할에 대한 책임감을 갖게 되었다.

Page 25: 2012 Dm B3 보고서(06박찬흥)

둘째 날둘째 날둘째 날둘째 날 년 월 일 금요일2012 4 27

오늘의 작업오늘의 작업오늘의 작업오늘의 작업 학습할 내용에 대한 설명 및 이해

토의 내용토의 내용토의 내용토의 내용

과제를 수행하기 위해서는 가장 먼저 이해해야 할 Minimum Spanning Tree을 중심적으로

설명을 하였다.

Spanning treeSpanning treeSpanning treeSpanning tree

그래프에서 그래프의 모든 정점을 다 포함하는 트리.

부분 그래프이다 트리라서 사이클이 없다. .

Minimum spanning tree (MST)Minimum spanning tree (MST)Minimum spanning tree (MST)Minimum spanning tree (MST)

중에서 가중치 합이 최소가 되는spanning tree spanning tree.

개 가 있으면 는 개 있다N vertex edge N-1 .

일반적인일반적인일반적인일반적인 MSTMSTMSTMST

처음에 를 으로 놓고 를 계속 추가해 나간다 더 이상 안나올때까지 반복A 0 safe edge . .

safe edgesafe edgesafe edgesafe edge 단계마다 하나의 를 선택할 때 를 유지하도록: edge , minimum spanning tree

하는 edge.

respect a set Arespect a set Arespect a set Arespect a set A 그래프를 하나의 선으로 나눌 때 의 어떤 도 그 선을 지나가: , A edge

지 않을 때 그 선이 를 한다고 한다, A respect .

light edgelight edgelight edgelight edge 하게 나눈 선 을 지나는 중에서 최소 를 가진: respect cut( ) edge weight

들 중 하나 가 여러개 일 수도 있다 그리고 어떻게 을 하느냐에edge . (light edge . cut

따라 가 달라질 수 있다 면 이다light edge .)light edge safe edge .

과제준비에서과제준비에서과제준비에서과제준비에서

느낀 점느낀 점느낀 점느낀 점

프로젝트를 진행함에 있어 조원들 간 의견이 너무 다르고 배경지식 또한 부족함이 느껴

져서 이 내용에 대해 다시한번 조사하여 의견과 배경지식의 통일을 이루었다.

셋째 날셋째 날셋째 날셋째 날 년 월 일 화요일2012 5 1

오늘의 작업오늘의 작업오늘의 작업오늘의 작업 과제 풀이 및 과제 알고리즘 작성1 2

토의 내용토의 내용토의 내용토의 내용

구하는 방법구하는 방법구하는 방법구하는 방법MSTMSTMSTMST

1. Kruskal algorithm1. Kruskal algorithm1. Kruskal algorithm1. Kruskal algorithm

는 이다set A forest .

전체 에서 두개의 를 연결하는 가 가장 작은 를 찾는다forest tree weight edge . vertex

하나도 하나의 이다tree .

그 가 이면 이다edge light edge safe edge .

를 의 에 추가해 나간다safe edge set A forest .

사이클을 이루지 않도록 최소 를 하나씩 선택해서 모든 가 다 포함되weight edge vertex

면 가 된다minimum spanning tree .

구현구현구현구현

Page 26: 2012 Dm B3 보고서(06박찬흥)

이용disjoint-set .

을 만든다 들을 정렬한 다음 제일 작은 부터 선택한다 선택된vertex set . edge edge .

가 사이클을 안만드는 것이어야 한다 에서 와 를 해서 두edge . edge (u,v) u v find-set(x)

개 값이 똑같으면 같은 에 있다는 거니까 다른 값이 나와야 한다 다르면 한set . union

다.

성능성능성능성능

의 구조에 따라 성능 차이가 있다 와 을disjoint-set . union-by-rank path-compression

이용하면 빠르다.

수를 수를 이라 하면Edge m, Vertex n

초기화1. set (n)Θ

정렬2. edge (m lg m),Θ

는 이것을 모든 에 대해 반복하므로3. find, equal, merge (lg m), Edge (m lg m)Θ Θ

이다.

이기 때문에 번이 번을 지배 따라서m >= n-1 2,3 1 . (m lg m)Θ

최악의 경우 완전그래프일 경우 의 개수는 따라서 시간복잡도가edge m=n(n-1)/2.

(n^2lg n)

를 사용해서 값을 구하면 이게 정말 인지 확인해야 한Greedy method optimal solution

다.

2. Prim algorithm2. Prim algorithm2. Prim algorithm2. Prim algorithm

마찬가지로 탐욕적인 방법.

는 언제나 하나의 이다 은set A tree .(Kruskal forest)

와 연결되는 구하기 와 나머지를 나누는 선을 긋고 그 선을set A light edge . set A ,

지나는 최소 중 하나가edge light edge.

에서 시작한다root vertex .

구현구현구현구현

를 라고 하자Minimum spanning tree A .

모든 노드를 우선순위큐에 넣고

최소 를 가진 를 꺼낸다 처음에 초기화할 때 루트의 가 이고 나머지는key vertex . ( key 0

다 무한대로 설정해서 처음에 루트가 꺼내져서 에 들어간다 꺼낸 의 인접A .) vertex(u)

큐에 아직 남아있는 것 만 탐색하여 의 키값이 의 값보vertex(v) ( ) v (u,v) edge weight

다 크다면 값을 값으로 변경한다 그리고 부모노드를 로 설정한다 큐가 비key weight . u .

워질 때까지 이 과정을 반복한다.

성능성능성능성능

큐에 가 없을 때까지 문 반복 번 는 수vertex while , |V| . (V vertex )

큐에서 최소값 뽑는 것이 O(lg V).

다 돌면 큐에서 모든 를 뽑으니까 번while vertex O(V lg V) ----------1

그래프의 인접리스트의 총 길이는 는 수edge 2|E| (undirected graph, E edge )

그래서 큐에서 뽑고 그 의 인접리스트를 탐색하는 거vertex vertex O(E).

탐색 과정에서 가 큐에 있는지 확인하고 있으면 값 변경하고 부모노드 설정vertex key , .

Page 27: 2012 Dm B3 보고서(06박찬흥)

큐에 있는지 확인하는 것은 에 하나를 할당하여 큐에 있는지 없는지 상태를vertex bit

나타내면 큐를 다 뒤지지 않고도 상수시간에 큐에 존재여부를 확인 할 수 있다.

부모노드 설정도 상수시간.

그리고 값 변경하는 것은 에서 랑 같은거다 값 변경하고key min-heap Decrease-key .(key

이 유지되도록 변경된 의 트리에서의 위치를 찾는 것 이다min-heap vertex ) O(lg V) .

따라서 인접리스트 탐색하면서 값 변경하는 시간은 번key O(E lgV) ----------2

번에 의해 은1,2 total time O(V lg V + E lg E) = O(E lg V)

을 통해 성능향상을 할 수 있다Fibonacci heap .

과제준비에서과제준비에서과제준비에서과제준비에서

느낀 점느낀 점느낀 점느낀 점

을 구현하는데 두가지 방법이 있는데 두가지 방법을 다 적용시켜Minimum spanning tree

서 코딩해보기로 하였다.

넷째 날넷째 날넷째 날넷째 날 년 월 일 목요일2012 5 10

오늘의 작업오늘의 작업오늘의 작업오늘의 작업 프로그램 소스 초안 코딩k-combination

초안초안초안초안

노드를 그만 입력하고 싶을경우엔#include <stdio.h> //

을 입력하면 입력이 종료되는 프로그램 입니다#include <stdlib.h> // 0 .

노드와 가중치를 입력받을 구조체struct mst_edge{ //

char edge[5];

int node;

};

typedef struct mst_edge mst;

구조체에 노드와 엣지를 입력하는 함수int insert(mst *set2[], int j); //

사이클을 찾아서 사이클이void union_set(mst *set2[], char uni[], int no); //

사이클이 안되게 엣지를 뽑음//

int main(){

int no;

int i, j=0, k=0, sum=0, end=0;

노드갯수 입력받음scanf("%d", &no); //

노드갯수 만큼 배열지정 사이클을 찾을때 씀char uni[no]; //

으로 초기화for(i=0; i<no; i++){ // 0

uni[i] = 0;

}

최대로 입력받을수 있는 엣지 수for(i=no-1; i>0; i--) sum = sum+i; //

각 엣지와 가중치의 주소를 저장하는 포인트배열mst *set2[sum]; //

임의로 만들어준 배열mst *temp[sum]; //

최대로 입력받을수 있는for(j=0; j<sum; j++){ //

엣지만큼 입력받음end = insert(set2, j); //

혹은 을 입력받으면if(end==1) break; // 0

입력종료} //

Page 28: 2012 Dm B3 보고서(06박찬흥)

가중치를 오름차순 정렬함for(i=0; i<j-1; i++){ //

for(k=i+1; k<j; k++){

if(set2[i]->node > set2[k]->node){

temp[i]=set2[i];

set2[i]=set2[k];

set2[k]=temp[i];

}

}

}

집합에 각uni[0] = set2[0]->edge[1]; // uni

처음 노드들을 넣음uni[1] = set2[0]->edge[2]; //

가중치가 제일 작은printf("%c%c, ", set2[0]->edge[1], set2[0]->edge[2]);//

처음의 엣지를 출력//

사이클을 찾아서 출력union_set(set2, uni, no); //

/*printf("\n%d\n%d\n\n", sum, j);

for(i=0; i<j; i++){

printf("\n%c%c\n", set2[i]->edge[1], set2[i]->edge[2]);

}

printf("\n");

for(i=0; i<no; i++){

printf("%c\t", uni[i]);

}*/

마지막에 를 지워줌printf("%c%c", 8, 8); // ,

//getch();

return;

}

int insert(mst *set2[], int j){

mst *set;

구조체 할당받음set = (mst *)malloc(sizeof(mst)); //

int i, last;

엣지를 입력받음for(i=0; i<5; i++){ //

scanf("%c", &(set->edge[i]));

if(set->edge[i] == ' ') break;

을 입력받으면 종료if(set->edge[i] == '0'){ // 0

last = 1;

return last;

}

}

가중치를 입력받음scanf("%d", &(set->node)); //

포인터 배열에 주소를 넘김set2[j]=set; //

나중에 정렬을 위해서last = 0; //

return last;

Page 29: 2012 Dm B3 보고서(06박찬흥)

}

집합에서 두 노드를 검색하여void union_set(mst *set2[], char uni[], int no){ //uni

두 노드 모두 집합에 있으면int a, count=1, i=1; // uni

사이클 이 있으므로 뽑지 않음while(1){ //

for(a=1; a<3; a++){

if(uni[set2[i]->edge[a]-65] ==0){

printf("%c%c, ", set2[i]->edge[1],

set2[i]->edge[2]);

uni[set2[i]->edge[a]-65] =

set2[i]->edge[a];

count++;

break;

}

}

i++;

노드 개 까지 뽑으면 리턴if(count==no-1) return;// -1

}

}

/*

void union_set(mst *set2[], char uni[], int i, int no){

int a, b, c, count=0;

for(a=0; a<no; a++){

if(set2[i]->edge[1] != uni[a]){

printf("%c%c, ", set2[i]->edge[1], set2[i]->edge[2]);

count++;

for(b=0; b<no; b++){

if(uni[b]==0){

uni[b]=set2[i]->edge[1];

uni[b+1]=set2[i]->edge[2];

return;

}

}

}

if(set2[i]->edge[1] == uni[a]){

for(b=0; b<no; b++){

if(set2[i]->edge[2] == uni[b]) return;

else if(set2[i]->edge[2] != uni[b]){

printf("%c%c, ", set2[i]->edge[1],

set2[i]->edge[2]);

count++;

for(c=0; c<no; c++){

if(uni[c]==0){

uni[c]=set2[i]->edge[2];

return;

}

}

Page 30: 2012 Dm B3 보고서(06박찬흥)

}

}

}

}

}

*/

/*

void counting(mst *set2[], int count[], int no){

int i=0, j;

for(j=0; j<no-1; j++){

for(i=1; i<3; i++) count[set2[j]->edge[i]-65] =

count[set2[j]->edge[i]-65]+1;

if(count[set2[j]->edge[1]-65]<2 || count[set2[j]->edge[2]-65]<2){

for(i=1; i<3; i++){

printf("%c", set2[j]->edge[i]);

}

}

printf(", ");

}

이방법은 실패함} */ //

문제점문제점문제점문제점 프로그램 실행이 되지 않는다.

해결 방안해결 방안해결 방안해결 방안초안 프로그램에서 수정을 하려고 하였으나 문제점이 해결이 되지 않아 다른 방법의 알

고리즘으로 프로그램을 구성하기로 하였다.

결과결과결과결과III.III.III.III.

최종 프로그램최종 프로그램최종 프로그램최종 프로그램

소스소스소스소스

노드를 그만 입력하고 싶을경우엔#include <stdio.h> //

을 입력하면 입력이 종료되는 프로그램 입니다#include <stdlib.h> // 0 .

노드와 가중치를 입력받을 구조체struct mst_edge{ //

char edge[5];

int node;

};

typedef struct mst_edge mst;

구조체에 노드와 엣지를 입력하는 함수int insert(mst *set2[], int j); //

사이클을 찾아서 사이클이void union_set(mst *set2[], char uni[], int no); //

사이클이 안되게 엣지를 뽑음//

int main(){

int no;

int i, j=0, k=0, sum=0, end=0;

노드갯수 입력받음scanf("%d", &no); //

노드갯수 만큼 배열지정 사이클을 찾을때 씀char uni[no]; //

으로 초기화for(i=0; i<no; i++){ // 0

Page 31: 2012 Dm B3 보고서(06박찬흥)

uni[i] = 0;

}

최대로 입력받을수 있는 엣지 수for(i=no-1; i>0; i--) sum = sum+i; //

각 엣지와 가중치의 주소를 저장하는 포인트배열mst *set2[sum]; //

임의로 만들어준 배열mst *temp[sum]; //

최대로 입력받을수 있는for(j=0; j<sum; j++){ //

엣지만큼 입력받음end = insert(set2, j); //

혹은 을 입력받으면if(end==1) break; // 0

입력종료} //

가중치를 오름차순 정렬함for(i=0; i<j-1; i++){ //

for(k=i+1; k<j; k++){

if(set2[i]->node > set2[k]->node){

temp[i]=set2[i];

set2[i]=set2[k];

set2[k]=temp[i];

}

}

}

집합에 각uni[0] = set2[0]->edge[1]; // uni

처음 노드들을 넣음uni[1] = set2[0]->edge[2]; //

가중치가 제일 작은printf("%c%c, ", set2[0]->edge[1], set2[0]->edge[2]);//

처음의 엣지를 출력//

사이클을 찾아서 출력union_set(set2, uni, no); //

/*printf("\n%d\n%d\n\n", sum, j);

for(i=0; i<j; i++){

printf("\n%c%c\n", set2[i]->edge[1], set2[i]->edge[2]);

}

printf("\n");

for(i=0; i<no; i++){

printf("%c\t", uni[i]);

}*/

마지막에 를 지워줌printf("%c%c", 8, 8); // ,

//getch();

return;

}

int insert(mst *set2[], int j){

mst *set;

구조체 할당받음set = (mst *)malloc(sizeof(mst)); //

int i, last;

엣지를 입력받음for(i=0; i<5; i++){ //

scanf("%c", &(set->edge[i]));

Page 32: 2012 Dm B3 보고서(06박찬흥)

if(set->edge[i] == ' ') break;

을 입력받으면 종료if(set->edge[i] == '0'){ // 0

last = 1;

return last;

}

}

가중치를 입력받음scanf("%d", &(set->node)); //

포인터 배열에 주소를 넘김set2[j]=set; //

나중에 정렬을 위해서last = 0; //

return last;

}

집합에서 두 노드를 검색하여void union_set(mst *set2[], char uni[], int no){ //uni

두 노드 모두 집합에 있으면int a, count=1, i=1; // uni

사이클 이 있으므로 뽑지 않음while(1){ //

for(a=1; a<3; a++){

if(uni[set2[i]->edge[a]-65] ==0){

printf("%c%c, ", set2[i]->edge[1],

set2[i]->edge[2]);

uni[set2[i]->edge[a]-65] =

set2[i]->edge[a];

count++;

break;

}

}

i++;

노드 개 까지 뽑으면 리턴if(count==no-1) return;// -1

}

}

/*

void union_set(mst *set2[], char uni[], int i, int no){

int a, b, c, count=0;

for(a=0; a<no; a++){

if(set2[i]->edge[1] != uni[a]){

printf("%c%c, ", set2[i]->edge[1], set2[i]->edge[2]);

count++;

for(b=0; b<no; b++){

if(uni[b]==0){

uni[b]=set2[i]->edge[1];

uni[b+1]=set2[i]->edge[2];

return;

}

}

}

if(set2[i]->edge[1] == uni[a]){

for(b=0; b<no; b++){

if(set2[i]->edge[2] == uni[b]) return;

else if(set2[i]->edge[2] != uni[b]){

printf("%c%c, ", set2[i]->edge[1],

Page 33: 2012 Dm B3 보고서(06박찬흥)

set2[i]->edge[2]);

count++;

for(c=0; c<no; c++){

if(uni[c]==0){

uni[c]=set2[i]->edge[2];

return;

}

}

}

}

}

}

}

*/

/*

void counting(mst *set2[], int count[], int no){

int i=0, j;

for(j=0; j<no-1; j++){

for(i=1; i<3; i++) count[set2[j]->edge[i]-65] =

count[set2[j]->edge[i]-65]+1;

if(count[set2[j]->edge[1]-65]<2 || count[set2[j]->edge[2]-65]<2){

for(i=1; i<3; i++){

printf("%c", set2[j]->edge[i]);

}

}

printf(", ");

}

}

결과 출력결과 출력결과 출력결과 출력 방법을 바꾸어 보았으나 프로그램 자체가 실행이 되지 않는다.

반성반성반성반성....ⅣⅣⅣⅣ

과제를 마치면서과제를 마치면서과제를 마치면서과제를 마치면서

느낀 점느낀 점느낀 점느낀 점

역할분담은 잘 되었으나 과제를 이해함에 있어서 초반에 의견차이가 조금 있었다 그래.

서 의견과 배경지식의 재정립에 시간이 조금 소모하여서 알고리즘 구축에 소비한 시간

이 부족하였다 그래서 자연히 코딩하는 시간도 부족했고 오류 수정하는 시간 또한 부.

족하여 결국 프로그램이 실행되지 않았다 다음 과제때에는 첫 회의때 조원들끼리 배경.

지식을 확실히 습득한 이후에 모였으면 바람직할거 같다.

Page 34: 2012 Dm B3 보고서(06박찬흥)

이산치 수학 조B3

과제 보고서비트 덧셈기 설계[Project#6 : 2- ]

조장 최완철:

조원 박찬흥:

정의수

백지원

Page 35: 2012 Dm B3 보고서(06박찬흥)

과제수행일지과제수행일지과제수행일지과제수행일지소속 조원

B3 조장 최완철: 자료조사 정의수 백지원: , 프로그래밍 박찬흥:과제수행기간 일 약 시간3 18

계획의 작성I.

연구제목 비트 덧셈기 설계2-

연구배경학습내용인 가산기의 개념과 구성을 알고 가산기를 직접 설계와 구현을 해보고, 2bit조사해 봄으로써 보다 심층적으로 내용을 이해하고 공부한다, .

참고자료 참고 URLhttp://ko.wikipedia.org/wiki/%EA%B0%80%EC%82%B0%EA%B8%B0

가산기의 개념과 종류 및 설명-

계획의 실행II.

첫째 날 년 월 일 화요일2012 5 29오늘의 작업 조원의 업무 분담 및 과제에 대한 이해와 숙지

토의 내용

조장 최완철:자료조사 정의수 백지원: ,프로그래밍 박찬흥:

위와 같이 임무 분담을 나누었으며 학습할 내용에 대하여 각자가 맡은 분야에 대한,공부와 함께 몇 개씩 나누어 자료조사를 하기로 하고 해산하였다.

과제준비에서

느낀 점

학년 학기 때 배우는 논리설계 과목에서 자주 사용하는 회로도가 있고 내용도 연관2 1 ,성이 있어서 두 가지 과목을 서로 연관하여 생각해보며 공부할 수 있어서 지루하지 않고 좋았다.

Page 36: 2012 Dm B3 보고서(06박찬흥)

둘째 날 년 월 일 목요일2012 5 31오늘의 작업 덧셈기 가산기 에 대한 이해와 숙지 및 프로그램 과제 알고리즘 작성( )

토의 내용

반가산기반가산기반가산기반가산기----

반가산기 는 이진수의 한자리수를 연산하고 자리올림수는 자리올림수 출력(half adder) ,에 따라 출력한다 의 세 가지 종류의 논리회로만으로 구성(carry out) . AND, OR, NOT

할 수 있다 최종값은 와 같다. 2C+S .입력 입력 출력 자리올림수 출력 의 관계를 보여주는 진리표는 다음과 같A, B, (S), (C)다.

- 전가산기전가산기전가산기전가산기

전가산기 는 이진수의 한 자릿수를 연산하고 하위의 자리올림수 입력을 포(full adder) ,함하여 출력한다 하위의 자리올림수 출력을 상위의 자리올림수 입력에 연결함으로써.임의의 자리수의 이진수 덧셈이 가능해진다 하나의 전가산기는 두개의 반가산기와 하.

A B C S0 0 0 00 1 0 11 0 0 11 1 1 0

Page 37: 2012 Dm B3 보고서(06박찬흥)

나의 로 구성된다OR .입력이 개 존재해서 입력 입력 자리올림수 입력 모두 대등하게 동작한다 하3 ( A, B, ) .지만 회로상에서 개 입력이 대칭되어 있다고 할 수 없다3 .입력 입력 자리올림수 입력 출력 자리올림수 출력 의 관계를 보여A, B, (X), (S), (C)주는 진리표는 다음과 같다.

전가산기는 전통적인 트랜지스터 수준의 회로나 여러 게이트들의 조합과 같이 여러가지방법으로 구현될 수 있다 한 가지 예는 와 로 표현한 것이다 이 구현 방식에서 자리. .올림수 출력 전의 마지막 게이트를 게이트로 바꾸어도 논리값이 바뀌지 않을OR XOR것이다 오직 두 가지 종류의 게이트를 사용하는 것이 칩 하나에 게이트 한 종류를 포.함하는 간단한 칩을 이용하여 전가산기를 구현할 때 유용하다 이러한 관점에서IC .

은 로 구현될 것이다Cout .전가산기는 또한 반가산기 두 개를 이용하여 구현할 수 있다 와 를 첫 번째 반가산. A B기에 연결하고 그 출력값을 두 번째 반가산기의 입력에 연결한다 그 후 두 번째 반가.산기의 다른 입력에 을 연결하여 두 번째 반가산기의 출력값이 값이 되고 자리올림Ci S ,수 출력인 은 두 반가산기의 자리올림수 출력을 연산이 된다 마찬가지로 는Cout OR . S

세 비트의 연산으로 만들어질 수 있으며 은 세 비트의 다A, B, Ci XOR Cout A, B, Ci수결 함수로 만들어질 수 있다.

A B X C S0 0 0 0 00 0 1 0 10 1 0 0 10 1 1 1 01 0 0 0 11 0 1 1 01 1 0 1 01 1 1 1 1

과제준비에서

느낀 점

가산기에 위에서 나열한 것들 이외에도 많은 종류가 포함되어 있다는 것을 알게 되었고 각각의 개념을 이해하면서 우리가 과제를 해결하는데 어떤 것을 이용해야할지 왜, ,그것을 이용해야 하는지를 알게 되어 많은 공부가 되었다.

셋째 날 년 월 일 목요일2012 6 7오늘의 작업 비트 덧셈기 과제의 프로그램 소스 초안2-

토의 내용

소스 초안

#include <stdio.h>

int u_halfAdder(int a, int b);

int v_halfAdder(int a, int b);

int main(){

int a, b, c, d;

int u1, v1, u2, v2;

int e, f;

char ch;

while(1){

scanf("%d %d %d %d", &a, &b, &c, &d);

u1 = u_halfAdder(a, c);

v1 = v_halfAdder(a, c);

u2 = u_halfAdder(b, d);

v2 = v_halfAdder(b, d);

Page 38: 2012 Dm B3 보고서(06박찬흥)

e = u_halfAdder(v1, u2);

f = v_halfAdder(v1, u2);

e = u_halfAdder(u1, e);

printf("%d %d %d\n", e, f, v2);

printf("continued (Y/N) : ");

fflush(stdin);

scanf("%c", &ch);

if(ch == 'N') break

}

getch();

return

}

int u_halfAdder(int a, int b){

if(a!=b) return 0;

else if(a==b){

if(a==0) return 0;

else return 1;

}

}

int v_halfAdder(int a, int b){

if(a!=b) return 1;

else if(a==b) return 0;

}

문제점

비트 덧셈기의 회로도에서 제일 마지막 부분의 논리합을 구성하지 않고1. 2- Half로 해버려서 제대로 출력되지 않음adder .입력 전까지 반복해서 프로그램이 돌아가도록 했는데 원인은 모르겠으나 이전 값2. N ,

을 계속해서 출력하는 문제가 있음.

해결 방안문제점 마지막에 논리합 을 만들어서 이용함1 - (OR) function문제점 반복해서 입력을 받지 않도록 수정함2

결과결과결과결과III.III.III.III.

최종 프로그램

소스

#include <stdio.h>

int u_halfAdder(int a, int b);int v_halfAdder(int a, int b);int l_sum(int a, int b);

Page 39: 2012 Dm B3 보고서(06박찬흥)

int main(){int a, b, c, d;int u1, v1, u2, v2, u3;int e, f;char ch;

scanf("%d %d %d %d", &a, &b, &c, &d);u1 = u_halfAdder(a, c);v1 = v_halfAdder(a, c);u2 = u_halfAdder(b, d);v2 = v_halfAdder(b, d);u3 = u_halfAdder(v1, u2);f = v_halfAdder(v1, u2);e = l_sum(u1, u3);printf("e : %d\nf : %d\ng : %d\n", e, f, v2);

return;}

int u_halfAdder(int a, int b){if(a!=b) return 0;else if(a==b){

if(a==1) return 1;if(a==0) return 0;

}}

int v_halfAdder(int a, int b){if(a!=b) return 1;else if(a==b) return 0;

}

int l_sum(int a, int b){if(a==b){

if(a==1) return 1;if(a==0) return 0;

}if(a!=b) return 1;

}

Page 40: 2012 Dm B3 보고서(06박찬흥)

결과 출력

반성.Ⅳ

과제를 마치면서

느낀 점

앞에서도 말했지만 다른 과목에서 배우고 있는 배웠던 내용과 많은 연관성이 있어서, ,문제를 푸는데 많은 도움이 되었고 그 과목과 자료구조 과목을 연관 지어 생각해볼,수 있는 기회여서 많은 공부가 되었다.

Page 41: 2012 Dm B3 보고서(06박찬흥)

이산치 수학 조B3

과제 보고서[Project #7: Group codes]

조장 박찬흥:

조원 정의수:

최완철

백지원

Page 42: 2012 Dm B3 보고서(06박찬흥)

과제수행일지과제수행일지과제수행일지과제수행일지소속 조원

B3 조장 박찬흥: 자료조사 정의수 최완철: , 프로그래밍 박찬흥 백지원: ,과제수행기간 일 약 시간3 29

계획의 작성I.

연구제목 Group codes

연구배경학습내용을 공부하고 프로그램 코딩을 직접 해보면서 허프만 코드에 대해 이해를 하고 숙지한다.

참고자료

참고 서적전산수학 및 전산이론을 위한 이산수학 및 응용 박진홍 지음/이산수학 박종안 이재진 이준열 지음/ , ,

참고 URL

http://blog.naver.com/zenix4078?Redirect=Log&logNo=10463440http://blog.naver.com/aih303?Redirect=Log&logNo=20127176173

자료//Huffman code

계획의 실행II.

첫째 날 년 월 일 월요일2012 6 11오늘의 작업 조원의 업무 분담 및 과제에 대한 이해와 숙지

토의 내용

조장 :자료조사 :프로그래밍 :

위와 같이 임무 분담을 나누었으며 에 대해 교수님의 설명을 들었다, Huffman code .에 대한 자세한 내용은 각자 자료조사를 통해서 개인적으로 공부를 해 온Huffman code

다음 수요일 모여 토의를 하며 조사해 온 내용을 설명하고 공부하기로 하였다.

과제준비에서

느낀 점

이번 과제는 교수님께서 따로 지정해 주신 학습내용이 없었기 때문에 수업시간에 교수님께 설명을 들었던 가 과제를 수행하면서 가장 중요한 내용이라고 판단Huffman code을 내려 그것을 중점적으로 공부해야 할 필요성을 느꼈다.

Page 43: 2012 Dm B3 보고서(06박찬흥)

둘째 날 년 월 일 수요일2012 6 13오늘의 작업 에 대한 이해와 숙지Huffman code

토의 내용

과제 수행을 하는 데에 필요한 허프만 코드에 대해 자료조사를 하고 조사한 내용을 토의시간에 조원들에게 설명을 하면서 이해를 하였다.

허프만코드 일종의 파일 압축 알고리즘:텍스트에 나타나는 특정 문자에 대한 빈도수를 이용자주 사용되는 문자는 짧은 코드를 자주 사용하지 않는 문자는 긴 코드를 지정,실제 평균 문자 코드 길이를 줄여 압축하는 방법파일에 사용되는 문자의 사용빈도가 높은 것은 이진트리의 높은 위치에 낮은 것은,

이진트리의 낮은 위치에 놓아 코드화허프만 코드는 접두 코드를 회피하여 문자 표현어떤 코드가 다른 코드의 접두사가 되지 않으면 코드의 길이는 서로 달라도 문자를

표현하는데 지장 없음이진트리를 생성하여 트리의 왼쪽 종속트리로 갈 때에는 오른쪽 종속트리로 갈 때0,

에는 로 코드화1허프만 코드는 가장 널리 쓰이는 압축 방법문자가 나타나는 빈도수에 따라 그 크기를 다르게 하는 것 빈도수 의존 코드:모음과 등과 같이 자주 나타나는 문자들은 더 작은 비트를 할당'L', 'R', 'S', 'N', 'T'허프만코드 생성 방법단 하나의 노드만을 가지고 있는 이진트리와 각 문자를 매핑각 트리에 문자들의 빈도수를 할당 트리의 가중치 내림차순으로 정렬: (weight) -두 개의 가장 작은 가중치를 가지고 있는 트리를 찾아 하나의 트리로 합치고 새로운

루트 노드를 만들어 냄 이 새 트리의 가중치는 합쳐진 두 트리의 가중치의 합( )마지막으로 하나의 트리가 남을 때까지 이 과정을 반복이 과정이 끝났을 때 원래 노드들의 각각은 마지막 이진트리의 말단 노드 가 됨(leaf)이진트리에서 루트로부터 말단 노드에 이르는 유일한 길 이 있게 되고 이 길이(path)

허프만 코드가 됨 각 왼쪽 자식 포인터에 을 할당하고 오른쪽 자식 포인터에 을( 0 , 1할당해서 결정)

위와 같이 허프만 코드가 어떤 것인지에 대해 공부하였고 허프만 코드의 생성 방법에대해 이해를 하였다 다음 토의 시간에는 부족한 내용에 대해 보충 자료조사를 해 온.다음 공부하기로 하였다.

과제준비에서

느낀 점

에 대한 기본적인 이론만 조사를 하고 난 다음 토의를 했기 때문에 더 정Huffman code확한 이해를 위해서는 조금 더 넓은 범위의 자료조사를 통해서 공부를 해야 할 필요성을 느꼈다 를 알고리즘 적으로 어떻게 사용이 되는지 알아보고 이것을. Huffman code어떤 식으로 과제에 적용할 것인지 생각해보게 되었다.

셋째 날 년 월 일 월요일2012 6 18오늘의 작업 에 대한 보충 설명과 프로그램 과제 이해 및 숙지Huffman code

Page 44: 2012 Dm B3 보고서(06박찬흥)

토의 내용

■ 허프만 코드 알고리즘 단계.압축을 하기 위한 텍스트 문서를 입력 후 버퍼에 저장한다1) .버퍼에 저장한 문자들을 하나씩 읽어서 빈도수를 구한다2) .빈도수가 낮은 것일수록 먼저 합치고 높은 것은 나중에 합쳐서 트리를 구성한다3) .

단 일반적인 트리와는 같지만 단지 아래서 위로 트리를 구성한다는 것은 다르다( , .)트리가 구성되면 전위탐색을 통해서 각 단어의 경로 번호를 구성 받는다 만일 트리4) .

가 왼쪽에 있으면 오른쪽에 있으면 이런식으로 번호를 부여한다0, 1 .부여 받은 번호와 단어를 매칭하는 테이블을 구성한다5) .테이블을 통해서 매칭 받은 단어들과 원래 단어를 매칭해서 비트 연산을 한다 압축6) .(

을한다)헤더 파일을 구성한다 형 길이 형 길이- (4byte(int ) =head , 4byte(int ) = table , 4byte(int

형 총데이타 길이 형 비트단위 연산을 한 데이터 길이) = , 4byte(int )= ,형 문자 아스키코드 형 빈도수 총길2byte(char )= table ( ), 4byte(int )=table ,byte = data

이)원본 문자들을 비트단위로 저장한다- .

이렇게 비트단위로 변경한 를 만이라는 임의의 확장자에 저장한다data .huff .압축 푸는 프로그램을 만든다7) .

헤더 파일에 내용을 읽어서 버퍼에 저장한다- .버퍼에 저장하기 전에 비트 연산을 통해서 원래 문자로 변경한다- .

을 구성한다- table .을 구성하고 빈도수를 가지고 트리를 구성한다- table .

트리 코드 과 원본 문자를 비교를 통해서 본래의 문자로 바꾼 후 텍스트 문서로 다- ( )시 만든다.

■ 트리 구성 원리

Page 45: 2012 Dm B3 보고서(06박찬흥)

테이블 구성 원리■

과제준비에서

느낀 점

자료조사를 통한 토의내용으로 공부를 하면서 를 사용할 때 이진트리를Huffman code함께 사용해야 한다는 것을 알게 되었고 이것을 과제에 적용시키기 위해서는 좀 더 다양한 방법을 생각해 봐야 할 것 같다고 느꼈다.

넷째 날 년 월 일 화요일2012 6 19오늘의 작업 과제의 프로그램 소스 초안Group code

토의 내용

소스 초안

#include <stdio.h>

#include <stdlib.h>

struct save{

char alpha;

char sub[20];

double beta;

};

typedef struct save save;

int insert(save *set2[], int i, int counting[]);

void probability(int a, int counting[], save *set2[]);

void change(save *tem[], int count);

int main(){

save *set2[20];

int counting[27];

int count=0, temp=0, i=0, j=0, k=0;

int stop;

for(i=0; i<27; i++) counting[i] = 0;

Page 46: 2012 Dm B3 보고서(06박찬흥)

for(i=0; i<20; i++){

stop = insert(set2, i, counting);

if(stop == 1) break

}

for(j=0; j<i; j++){

for(k=0; k<20; k++){

set2[j]->sub[k] = '2'

}

}

for(j=0; j<27; j++)

if(counting[j] > 0) count += 1;

save *set3[count];

save *tem[count];

probability(i, counting, set2);

for(j=0; j<27; j++){

if(counting[j] > 0){

for(k=0; k<i; k++){

if(j+97 == (int)set2[k]->alpha){

set3[temp] = set2[k];

temp++;

break

}

}

}

}

for(j=0; j<count-1; j++){

for(k=j+1; k<count; k++){

if(set3[j]->beta > set3[k]->beta){

tem[j] = set3[j];

set3[j] = set3[k];

set3[k] = tem[j];

}

}

}

for(j=0; j<count; j++) tem[j] = set3[j];

change(tem, count);

for(j=0; j<i; j++){

for(k=20; k>=0; k--){

if(set2[j]->sub[k] != '2'){

Page 47: 2012 Dm B3 보고서(06박찬흥)

printf("%c", set2[j]->sub[k]);

}

}

}

getch();

return

}

int insert(save *set2[], int i, int counting[]){

save *set;

set = (save *)malloc(sizeof(save));

scanf("%c", &(set->alpha));

if(set->alpha == 10) return 1;

if(set->alpha>='a' && set->alpha<='z') counting[set->alpha-97] += 1;

else if(set->alpha == ' ') counting[26] += 1;

set2[i] = set;

return 0;

}

void probability(int a, int counting[], save *set2[]){

int i=0, j=0;

for(i=0; i<27; i++){

if(counting[i] > 0){

for(j=0; j<a; j++){

if(i+97 == (int)set2[j]->alpha) set2[j]->beta

= (double)counting[i]/a;

}

}

}

}

void change(save *tem[], int count){

save *dlatl[count];

int q=2, w=0, e=0, r=0, t=0, y=0;

tem[1]->beta = tem[0]->beta + tem[1]->beta;

tem[0]->beta = tem[1]->beta;

tem[0]->sub[0] = '1'

tem[1]->sub[0] = '0'

while(1){

for(e=q-1; e<count-1; e++){

Page 48: 2012 Dm B3 보고서(06박찬흥)

for(r=e+1; r<count; r++){

if(tem[e]->beta > tem[r]->beta){

dlatl[e] = tem[e];

tem[e] = tem[r];

tem[r] = dlatl[e];

}

}

}

if(tem[q-1]->beta <= tem[q-2]->beta){

tem[q-1]->sub[0] = '1'

for(t=0; t<q-1; t++){

for(y=0; y<20; y++){

if(tem[t]->sub[y] == '2'){

tem[t]->sub[y] =

'0'

break

}

}

tem[q]->sub[y] = '0'

}

}

if((tem[q]->sub[0] == '2') || (tem[q-1]->sub[0] == '2')){

tem[q]->sub[0] = '0'

tem[q-1]->sub[0] = '1'

}

tem[q]->beta = tem[q]->beta + tem[q-1]->beta;

tem[q-1]->beta = tem[q]->beta;

if(q+2==count) return

q++;

}

}

문제점단어를 입력을 받았을 때 출력이 정상적으로 나오지 않고 쓰레기 값이 출력이 되는 것을 확인하였다.

해결 방안 함수에 대한 알고리즘을 다시 작성하여 프로그램 소스를 수정해 보기로Huffman code하였다.

Page 49: 2012 Dm B3 보고서(06박찬흥)

결과결과결과결과III.III.III.III.

최종 프로그램

소스프로그램 소스를 완성하지 못하였음.

반성.Ⅳ

과제를 마치면서

느낀 점

기말 시험기간이 겹쳐서 과제 진행을 하는 데에 시간을 많이 할애하지 못하는 조원이많았다 그래서 토의를 한 시간도 지금까지의 과제에 비하여 상대적으로 적었고 과제.진척도도 많이 느렸던 것 같았다.

기타시간이 여유가 좀 더 있었고 과제에 대한 이해가 조금 더 빨랐었다면 과제 수행이 훨씬수월해 질 수 있었던 것을 생각하면 많이 아쉬웠다.