4. Syntax of languages
과제 수행일지




A0 조


조원 20093516 장진승
   20093489 송하윤
   20093447 김도형
   20083438 김무경
   20073547 홍진욱
   20063532 조부관
*과제 수행기간 : 4월 23일 ~ 5월 4일 (11일)


*계획


 - 첫 주(4월 23일~4월 27일)
   프로그래밍 과제 알고리즘 정리
  각 개념에 관하여 연구


 - 둘째 주(4월 30일~5월4일)
  첫째 주에 연구한 알고리즘을 활용하여
  프로그래밍 과제 구현 및 토의
  전 주에 했던 연구 논의



*문제 파악
‘이산 수학에서의 그래프가 갖는 정의와 중요성이란?‘ 에 대해 알아보고 논의하자.



*이산수학에서 그래프란?
컴퓨터 과학에서의 그래프는 수학적인 그래프와 차별되며 자료구조의 그래프 구조와 그래프
관리에 사용되는 알고리즘에 영향을 받는다. 그래프이론을 살펴보자. 우리 생활과 밀접한
관련이 있는 도로망, 가계도, 지휘계통도 등은 그래프로 표현된다. 그래프이론은 친구 관계
와 같은 관계를 표현하는 수학구조이며, 그래프의 연결성과효과적인 알고리즘, 적절한 짝짓
기를 찾고 이를 이용하는 방법을 다룬다. 그래프이론은 그래프의 기본 성질, 중복그래프,
수형도, 그래프 색칠하기, 오일러 경로, 헤밀턴 회로 등과 이를 컴퓨터, 통신, 경제 분야의
응용도 다룬다.
*첫 주


(4월 23일~4월 27일)


임무 분담


조장: 조부관
자료조사 : 김무경 장진승
알고리즘 : 홍진욱 김도형
프로그램코딩 : -



1주차 학습/연구 한 내용
-   각 용어들의 정의와 쓰임새를 알아 보았다.(공란은 아직 토의나 연구되지 못한부분)


• vertex, edge :
 - Node(Vertex) : 정보를 나타냄, 정점
 - Link(Edge) : Node의 연결관계를 나타냄


• multigraph :
- 임의의 정점 쌍에 대하여 여러 개의 간선이 존재하는 그래프.


• Eulerian path :
- 어떤 도형의 모든 선을 정확하게 한 번씩만 지나가는 경로


• simple graph :
- 루프(loop)가 없고 두 정점 사이에 두 개 이상의 간선이 없는 그래프.


• path of length k
• cycle :
-첫째와 마지막 정점이 동일한 경로. 회로(circuit)라고도 함


• A graph is connected :
모든           정점의           쌍을   연결하는    경로가   존재하는 그래프.
• Hamiltonian circuit :
한 정점에서 시작해서 모든 정점을 한 번씩 들르는 경로가 존재하는 그래프를 말한다. 이때
그 경로를 그 그래프의 해밀턴 경로라고 한다.

• tree :
트리 회로. 나무가 하나의 뿌리(root)에서 줄기(trunk)가 나와 가지(branch)로 나누어지는 것
처럼, 어떤 하나의 집합(레코드나 디렉토리 등)으로부터 하위 레벨(lower level)로 가지가 나
오는 집합 관계를 갖는 계층 구조(hierarchic structure)를 말한다. 부분적으로도 결코 루트
를 형성하는 경우는 없다. 따라서 처음에 가지가 나오기 시작되고 있는 집합으로부터 차례
대로 「가지」를 더듬어가면 목적의 집합을 찾을 수 있다. 정보 처리 분야에는 이 같은 트
리 구조(tree structure)를 가진 개념이 많이 있고, 이 트리 구조에는 순서 트리(ordered
tree)나 2진 트리(binary tree) 등이 있다.

• spanning tree, minimum spanning tree :
연결된, 비방향성 그래프 G에서 순환 경로를 제거하면서 연결된 부분 그래프가 되도록 이
음선을 제거하면 spanning tree가 된다. 따라서 spanning tree는 G 안에 있는 모든 정점을
다 포함하면서 트리가 되는 연결된 부분 그래프이다. spanning tree중 각 가중치의 합이 최
소인 트리를 minimum spanning tree 라 한다.

• binary tree :
리스트 구조의 하나이며, 최상의 루트 노드로부터 서브트리 방향에 도달할 때, 각 루트로부
터 나와 있는 노드가 겨우 두 개인 모양의 트리. 데이터 집합을 기억 영역상에 표현한 경우
다음에 계속되는 데이터 항목으로의 포인터가 겨우 두 개인 모양의 구조를 가리킨다
* 둘째 주


(4월 30일~5월4일)


임무 분담


조장: 조부관
자료조사 : 김무경 장진승
알고리즘 : 홍진욱 김도형
프로그램코딩 : 홍진욱 김도형


2주차 학습/연구 한 내용
-   프로그래밍 과제 구현 및 토의 및 전 주에 했던 연구 논의




※ 소스

#include <stdio.h>
#define M 999


typedef struct EDGE {
         int pair1;
         int pair2;
}EDGE;


EDGE edge[1024];


//void setArr(int **G,char fst,char snd,int lst);
void prim(int **G,int start,int size);
int IsVertex(int vertex[], int a,int arrSize);
int minimum(int **G,int v);


//mendockusaite Kibong's CODE kakemasu.
int main(void){
    //input - exchanging Number to character or Character to Number.
    int heng,ryul;
    char fst[2],snd; int lst;
    char *p_fst,*p_snd;
p_fst=fst;p_snd=&snd;
     int arrSize=0;
     int **G = NULL;
     scanf("%d",&arrSize);
/*
*


*Memory Operation, Duble Pointer, initialize
*
*/
     int i,j;
     G= (int**)malloc(sizeof(int*) * arrSize);
     for(i=0;i<arrSize;i++){
          G[i] = (int*)malloc(sizeof(int) * arrSize);
     }


          for(i=0;i<arrSize;i++){
                   for(j=0;j<arrSize;j++){
                               if(j==i){
                                           G[i][j] = 0;
                               }else{
                                           G[i][j] = M;
                               }
                   }
          }
/*
*
*         input data
*
*/
// printf("%d",arrSize);
          int nr=0;
          for(i=1;i<arrSize;i++){
                   nr=nr+i;}



          int count=0;
     while(1){
          scanf("%s %d",fst,&lst);
          count++;
//        printf("%d %dn",fst[0],fst[1]);
/*             if(count == nr){                           // 모든 경로 입력
                      break;
           }*/
           G[fst[0]-65][fst[1]-65] = lst;
           G[fst[1]-65][fst[0]-65] = lst;
           if(count == 9){
                      break;
           }


     }
/*
*
*          arrPrint
*
*/
           for(i=0;i<arrSize;i++){
                      for(j=0;j<arrSize;j++){
                                 printf("%4d",G[i][j]);
                      }printf("n");
           }




//        printf("Minimum Spanning Tree (using Prim Algorithm)n");
/*
*
*          function call
*
*/
           prim(G,0,arrSize);
/*
*
*          result print
*
*/
           for(i=0; i<arrSize-1; i++)
                      printf("    %c%cn", (edge[i].pair1+1)+64, (edge[i].pair2+1)+64);


         getch();
           return 0;
}
void prim(int **G, int start,int arrSize){
          int vertex[arrSize] , index1 = 0;
          vertex[0] = 0;
          int v, k, nearst, index2 = 0,i=0,j=0;


/*
*
*         vertex check and pair check, prim algorithm operation.
*
*/
          vertex[index1++] = start;
          while(index1 < arrSize){
                   nearst = M;
                   for(i=0; i<index1; i++){
                            v = vertex[i];
                            for(j=0; j<arrSize; j++){
                                      k = G[j][v];
                                      if(k>0 && k<M && !IsVertex(vertex,j,arrSize)){
                                                 if(k < nearst) {
                                                         nearst = k;
                                                         edge[index2].pair1 = v;
                                                         edge[index2].pair2 = j;
                                                 }
                                      }
                            }
                   }
                   vertex[index1++] = edge[index2].pair2;
                   index2++;
          }
}


int IsVertex(int vertex[], int a,int arrSize){
     int i;
          for(i=0; i<arrSize; i++)
                   if(vertex[i] == a)
                            return 1;
                   return 0;
}
/*
*
*       unusing function.
*
*/
/*
int minimum(int **G,int v){
        int min, temp = M,i;
        for(i=0; i<; i++)
                 if(G[i][v] > 0 && G[i][v] < temp) {
                            min = i;
                            temp = G[i][v];
                            return i;
                 }
}
*/

2012 Dm A0 04 Pdf

  • 1.
    4. Syntax oflanguages 과제 수행일지 A0 조 조원 20093516 장진승 20093489 송하윤 20093447 김도형 20083438 김무경 20073547 홍진욱 20063532 조부관
  • 2.
    *과제 수행기간 :4월 23일 ~ 5월 4일 (11일) *계획 - 첫 주(4월 23일~4월 27일) 프로그래밍 과제 알고리즘 정리 각 개념에 관하여 연구 - 둘째 주(4월 30일~5월4일) 첫째 주에 연구한 알고리즘을 활용하여 프로그래밍 과제 구현 및 토의 전 주에 했던 연구 논의 *문제 파악 ‘이산 수학에서의 그래프가 갖는 정의와 중요성이란?‘ 에 대해 알아보고 논의하자. *이산수학에서 그래프란? 컴퓨터 과학에서의 그래프는 수학적인 그래프와 차별되며 자료구조의 그래프 구조와 그래프 관리에 사용되는 알고리즘에 영향을 받는다. 그래프이론을 살펴보자. 우리 생활과 밀접한 관련이 있는 도로망, 가계도, 지휘계통도 등은 그래프로 표현된다. 그래프이론은 친구 관계 와 같은 관계를 표현하는 수학구조이며, 그래프의 연결성과효과적인 알고리즘, 적절한 짝짓 기를 찾고 이를 이용하는 방법을 다룬다. 그래프이론은 그래프의 기본 성질, 중복그래프, 수형도, 그래프 색칠하기, 오일러 경로, 헤밀턴 회로 등과 이를 컴퓨터, 통신, 경제 분야의 응용도 다룬다.
  • 3.
    *첫 주 (4월 23일~4월27일) 임무 분담 조장: 조부관 자료조사 : 김무경 장진승 알고리즘 : 홍진욱 김도형 프로그램코딩 : - 1주차 학습/연구 한 내용 - 각 용어들의 정의와 쓰임새를 알아 보았다.(공란은 아직 토의나 연구되지 못한부분) • vertex, edge :  - Node(Vertex) : 정보를 나타냄, 정점  - Link(Edge) : Node의 연결관계를 나타냄 • multigraph : - 임의의 정점 쌍에 대하여 여러 개의 간선이 존재하는 그래프. • Eulerian path : - 어떤 도형의 모든 선을 정확하게 한 번씩만 지나가는 경로 • simple graph : - 루프(loop)가 없고 두 정점 사이에 두 개 이상의 간선이 없는 그래프. • path of length k • cycle : -첫째와 마지막 정점이 동일한 경로. 회로(circuit)라고도 함 • A graph is connected : 모든 정점의 쌍을 연결하는 경로가 존재하는 그래프.
  • 4.
    • Hamiltonian circuit: 한 정점에서 시작해서 모든 정점을 한 번씩 들르는 경로가 존재하는 그래프를 말한다. 이때 그 경로를 그 그래프의 해밀턴 경로라고 한다. • tree : 트리 회로. 나무가 하나의 뿌리(root)에서 줄기(trunk)가 나와 가지(branch)로 나누어지는 것 처럼, 어떤 하나의 집합(레코드나 디렉토리 등)으로부터 하위 레벨(lower level)로 가지가 나 오는 집합 관계를 갖는 계층 구조(hierarchic structure)를 말한다. 부분적으로도 결코 루트 를 형성하는 경우는 없다. 따라서 처음에 가지가 나오기 시작되고 있는 집합으로부터 차례 대로 「가지」를 더듬어가면 목적의 집합을 찾을 수 있다. 정보 처리 분야에는 이 같은 트 리 구조(tree structure)를 가진 개념이 많이 있고, 이 트리 구조에는 순서 트리(ordered tree)나 2진 트리(binary tree) 등이 있다. • spanning tree, minimum spanning tree : 연결된, 비방향성 그래프 G에서 순환 경로를 제거하면서 연결된 부분 그래프가 되도록 이 음선을 제거하면 spanning tree가 된다. 따라서 spanning tree는 G 안에 있는 모든 정점을 다 포함하면서 트리가 되는 연결된 부분 그래프이다. spanning tree중 각 가중치의 합이 최 소인 트리를 minimum spanning tree 라 한다. • binary tree : 리스트 구조의 하나이며, 최상의 루트 노드로부터 서브트리 방향에 도달할 때, 각 루트로부 터 나와 있는 노드가 겨우 두 개인 모양의 트리. 데이터 집합을 기억 영역상에 표현한 경우 다음에 계속되는 데이터 항목으로의 포인터가 겨우 두 개인 모양의 구조를 가리킨다
  • 5.
    * 둘째 주 (4월30일~5월4일) 임무 분담 조장: 조부관 자료조사 : 김무경 장진승 알고리즘 : 홍진욱 김도형 프로그램코딩 : 홍진욱 김도형 2주차 학습/연구 한 내용 - 프로그래밍 과제 구현 및 토의 및 전 주에 했던 연구 논의 ※ 소스 #include <stdio.h> #define M 999 typedef struct EDGE { int pair1; int pair2; }EDGE; EDGE edge[1024]; //void setArr(int **G,char fst,char snd,int lst); void prim(int **G,int start,int size); int IsVertex(int vertex[], int a,int arrSize); int minimum(int **G,int v); //mendockusaite Kibong's CODE kakemasu. int main(void){ //input - exchanging Number to character or Character to Number. int heng,ryul; char fst[2],snd; int lst; char *p_fst,*p_snd;
  • 6.
    p_fst=fst;p_snd=&snd; int arrSize=0; int **G = NULL; scanf("%d",&arrSize); /* * *Memory Operation, Duble Pointer, initialize * */ int i,j; G= (int**)malloc(sizeof(int*) * arrSize); for(i=0;i<arrSize;i++){ G[i] = (int*)malloc(sizeof(int) * arrSize); } for(i=0;i<arrSize;i++){ for(j=0;j<arrSize;j++){ if(j==i){ G[i][j] = 0; }else{ G[i][j] = M; } } } /* * * input data * */ // printf("%d",arrSize); int nr=0; for(i=1;i<arrSize;i++){ nr=nr+i;} int count=0; while(1){ scanf("%s %d",fst,&lst); count++; // printf("%d %dn",fst[0],fst[1]);
  • 7.
    /* if(count == nr){ // 모든 경로 입력 break; }*/ G[fst[0]-65][fst[1]-65] = lst; G[fst[1]-65][fst[0]-65] = lst; if(count == 9){ break; } } /* * * arrPrint * */ for(i=0;i<arrSize;i++){ for(j=0;j<arrSize;j++){ printf("%4d",G[i][j]); }printf("n"); } // printf("Minimum Spanning Tree (using Prim Algorithm)n"); /* * * function call * */ prim(G,0,arrSize); /* * * result print * */ for(i=0; i<arrSize-1; i++) printf(" %c%cn", (edge[i].pair1+1)+64, (edge[i].pair2+1)+64); getch(); return 0; }
  • 8.
    void prim(int **G,int start,int arrSize){ int vertex[arrSize] , index1 = 0; vertex[0] = 0; int v, k, nearst, index2 = 0,i=0,j=0; /* * * vertex check and pair check, prim algorithm operation. * */ vertex[index1++] = start; while(index1 < arrSize){ nearst = M; for(i=0; i<index1; i++){ v = vertex[i]; for(j=0; j<arrSize; j++){ k = G[j][v]; if(k>0 && k<M && !IsVertex(vertex,j,arrSize)){ if(k < nearst) { nearst = k; edge[index2].pair1 = v; edge[index2].pair2 = j; } } } } vertex[index1++] = edge[index2].pair2; index2++; } } int IsVertex(int vertex[], int a,int arrSize){ int i; for(i=0; i<arrSize; i++) if(vertex[i] == a) return 1; return 0; } /* *
  • 9.
    * unusing function. * */ /* int minimum(int **G,int v){ int min, temp = M,i; for(i=0; i<; i++) if(G[i][v] > 0 && G[i][v] < temp) { min = i; temp = G[i][v]; return i; } } */