#include <stdio.h>
#include <string.h>
#include <windows.h>

#define TRUE        1
#define FALSE       0

#define REG         1
#define VIEW        2
#define SEARCH      3
#define SAVE        4
#define LOAD        5
#define EXIT        6

#define S_ITEM  1
#define S_NAME  2
#define S_PHONE  3
#define S_ADDRESS 4
#define S_GROUP  5
#define S_MD  6
#define S_EXIT  7

#define LIST_MAX    100

typedef struct _list
{
    char name[255];
    char phone[255];
    char address[255];
    char group[255];
    int used;
    int searched;
}LIST;

void Main_Menu(int *total);         // 메인 메뉴 출력
void Exit(void);           // 프로그램 종료
void Registration(LIST *member, int *total);    // 새 리스트 등록
int Auto_num(LIST* member);         // 자동 번지 설정
void Contents_input(char *title, char *contents);   // 내용 저장
void List_view(LIST *member, int total);     // 리스트 보기
void File_save(LIST *member, int total);     // 리스트 파일 저장
void File_load(LIST *member, int *total);     // 리스트 파일 읽기
void Search(LIST *member, int *total);      // 리스트 검색
void Search_Menu(void);          // 리스트 검색 메뉴
void Search_init(LIST *member);        // 리스트 검색 초기화
void Search_view(LIST *member);        // 리스트 검색 결과 출력
void Search_item(LIST *member);        // 리스트 항목별 검색
void Search_string(LIST *member, int s_title);    // 리스트 문자별 검색
void Search_MD_Menu(void);         // 리스트 수정/삭제 메뉴
void Search_MD(LIST *member, int *total);     // 리스트 수정/삭제
void Re_registration(LIST *member, int s_item, int title); // 리스트 수정 등록


/* MAIN START */
void main()
{
    LIST member[LIST_MAX] = {0};    // 멤버 등록 정보
    int choice = 0;                 // 메뉴 선택
    int total =0;                   // 리스트 등록 수

    while(TRUE)
    {
        Main_Menu(&total);

        printf("Choice >> ");
        scanf("%d", &choice);
        fflush(stdin);

        switch(choice)
        {
        case REG    : { Registration(member, &total);   break; }
        case VIEW   : { List_view(member, total);  break; }
        case SEARCH : { Search(member, &total);   break; }
        case SAVE   : { File_save(member, total);  break; }
        case LOAD   : { File_load(member, &total);  break; }
        case EXIT   : { Exit();       break; }
        }
  system("pause");
    }
}


/* 메인 메뉴를 출력 합니다. */
void Main_Menu(int *total)
{
    system("cls");
    puts("");
    puts("┏━━━━━━━━━━━━━━━━━━┓");
    puts("┃          MY  ADDRESS BOOK          ┃");
    puts("┣━━━━━━━━━━━━━━━━━━┫");
    puts("┃   1. REGISTRATION                  ┃");
    puts("┃   2. LIST VIEW                     ┃");
    puts("┃   3. SEARCH <MODIFY / DELETE>      ┃");
    puts("┃   4. FILE SAVE                     ┃");
    puts("┃   5. FILE LOAD                     ┃");
    puts("┃   6. EXIT                          ┃");
    puts("┣━━━━━━━━━━━━━━━━━━┫");
 printf("┃   Total of list : %3d item.        ┃\n", *total);
 puts("┗━━━━━━━━━━━━━━━━━━┛");
    puts("");
}


/* 프로그램을 종료 합니다. */
void Exit(void)
{
    puts("");
    puts("┏━━━━━━━━━━━━━━━━━━┓");
    puts("┃            PROGRAM  END            ┃");
    puts("┗━━━━━━━━━━━━━━━━━━┛");
    puts("");
    exit(TRUE);
}


/* 새로운 주소를 등록 합니다. */
void Registration(LIST *member, int *total)
{
    int num, flag, i;
    char group[5][10] = {"FAMILY", "RELATIVE", "FRIEND", "COLLEAGUE", "Ete."};
    char item[5], decision;

 do
 {
  system("cls");

  if(*total == LIST_MAX)
  {
   puts("LIST FULL, Registration failed !");
   return;
  }

  do
  {
   flag = FALSE;
   num = Auto_num(member);
   printf("Auto register : [%3d] >> ", ++num);
   gets(item);
       
   if(item[0] != '\0')
   {
    num = atoi(item);
    if(member[num-1].used != 0)
    {
     flag = TRUE;
     printf("%d of list is already registered.\n", num);
     puts("Please, try again");
     system("pause");
     system("cls");
    }
   }
  }while(flag == TRUE);
  
  printf("\nRegistration : [%3d]\n", num);
  Contents_input("NAME\t", member[num-1].name);
  Contents_input("PHONE\t", member[num-1].phone);
  Contents_input("ADDRESS\t", member[num-1].address);

  do
  {
   for(i = 0; i < 5; i++)
    printf("\t%d. %s", i+1, group[i]);
   printf("\nGROUP\t>> ");
   scanf("%d", &i);
   fflush(stdin);
  }while (i < 0 && i > 6);
   
  strcpy(member[num-1].group, group[i-1]);
   
  printf("\nDo you want save? <N/n> or other keys >> ");
  decision = getchar();
  fflush(stdin);
  puts("");

  if( strchr("Nn", decision) != NULL )
   puts("SAVE Canceled.\n");
  else
  {
   member[num-1].used = 1;
   printf("SAVE Complete. Total of list : %3d item.\n", ++*total);
  }

  printf("\nDo you want input continue? <Y/y> or other keys >> ");
  decision = getchar();
  fflush(stdin);
  puts("");
 }while(strchr("Yy", decision) != NULL);
}


/* 빈번지를 자동으로 설정 합니다. */
int Auto_num(LIST *member)
{
    int i=0;
    while(member[i].used != 0)
  i++;
    return (i);
}


/* 타이틀을 출력하고 입력된 내용을 등록 합니다. */
void Contents_input(char *title, char *contents)
{
    do
    {
        printf("%s>> ", title);
        gets(contents);
    }while(contents[0] == '\0');
}


/* 등록된 리스트를 출력 합니다. */
void List_view(LIST *member, int total)
{
 int i;
 system("cls");

 if(total == 0)
 {
  puts("List is empty.");
  return;
 }

 puts("No.\t NAME\t PHONE\t ADDRESS\t GROUP\t");
 for(i = 0; i < LIST_MAX ; i++)
 {
  if(member[i].used != 0)
  {
   printf("[%3d]\t %s\t %s\t %s\t %s\t\n",
    i+1, member[i].name, member[i].phone, member[i].address, member[i].group);
  }
 }
}


/* 리스트를 파일로 저장 합니다. */
void File_save(LIST *member, int total)
{
 FILE *fp;
 int i;

 if(total == 0)
 {
  puts("List is empty.");
  puts("SAVE Canceled.\n");
  return;
 }
 
 fp = fopen("my_list.txt", "w");
 if(fp == NULL)
 {
  puts("Don't have enough of storage capacity.");
  puts("SAVE Canceled.\n");
  return;
 }

 for(i = 0; i < LIST_MAX ; i++)
 {
  if(member[i].used == 1)
  {
   fprintf(fp, "%d>%s>%s>%s>%s\n",
    i, member[i].name, member[i].phone, member[i].address, member[i].group);
   printf("[%3d]\t %s\t %s\t %s\t %s\t\n",
    i+1, member[i].name, member[i].phone, member[i].address, member[i].group);
  }
 }
 puts("SAVE Complete !!!\n");
 fclose(fp);
}


/* 리스트 파일을 읽어 옵니다. */
void File_load(LIST *member, int *total)
{
 FILE *fp;
 char decision, ch;
 int i, num;

 fp = fopen("my_list.txt", "r");

 if(fp == NULL)
 {
  puts("Can't read [my_list.txt] file.");
  puts("LOAD Canceled.\n");
  return;
 }

 if(*total != 0)
 {
  printf("\nDo you want file load? Your current data will be lost !\n");
  printf("<Y/y> or other keys >> ");
  decision = getchar();
  fflush(stdin);
  puts("");

  if( strchr("Yy", decision) != NULL )
  {
   *total = 0;
   for(i = 0; i < LIST_MAX; i++)
    member[i].used = 0;
   puts("Memory Initialized.\n");
  }
  else
  {
   puts("LOAD Canceled.\n");
   fclose(fp);
  }
 }

 puts("Data Loading...\n");
 while( (ch = fgetc(fp)) != EOF )
 {
  num = 0;
  do
  {
   num = num * 10 + (ch -'0');
  }while((ch = fgetc(fp)) != '>');

  i = 0;
  while((ch = fgetc(fp)) != '>')
   member[num].name[i++] = ch;
  member[num].name[i] = '\0';

  i = 0;
  while((ch = fgetc(fp)) != '>')
   member[num].phone[i++] = ch;
  member[num].phone[i] = '\0';

  i = 0;
  while((ch = fgetc(fp)) != '>')
   member[num].address[i++] = ch;
  member[num].address[i] = '\0';

  i = 0;
  while((ch = fgetc(fp)) != '\n')
   member[num].group[i++] = ch;
  member[num].group[i] = '\0';

  member[num].used = 1;

  ++*total;

  printf("[%3d]\t %s\t %s\t %s\t %s\t\n",
   num+1, member[num].name, member[num].phone, member[num].address, member[num].group);
  Sleep(300);
 }
 puts("\nLOAD Complete !!!\n");
 fclose(fp);
}


/* 검색 메뉴를 출력 합니다. */
void Search_Menu(void)
{
    system("cls");
    puts("");
    puts("┏━━━━━━━━━━━━━━━━━━┓");
    puts("┃            SEARCH MENU             ┃");
    puts("┣━━━━━━━━━━━━━━━━━━┫");
    puts("┃   1. Item Number Search            ┃");
    puts("┃   2. Name Search                   ┃");
    puts("┃   3. Phone Number Search           ┃");
    puts("┃   4. Address Search                ┃");
    puts("┃   5. Group Search                  ┃");
    puts("┃   6. Modify / Delete               ┃");
    puts("┃   7. EXIT                          ┃");
 puts("┗━━━━━━━━━━━━━━━━━━┛");
    puts("");
}


/* 수정/검색 메뉴를 출력 합니다. */
void Search_MD_Menu(void)
{
 puts("");
    puts("┏━━━━━━━━━━━━━━━━━━┓");
    puts("┃   1. Modify                        ┃");
    puts("┃   2. Delete                        ┃");
    puts("┃   3. EXIT                          ┃");
 puts("┗━━━━━━━━━━━━━━━━━━┛");
    puts("");
}


/* 리스트를 항목별로 검색 합니다. */
void Search(LIST *member, int *total)
{
 int choice, cnt = 0;

 while(TRUE)
 {
  Search_Menu();

  if(*total == 0)
  {
   puts("List is empty.");
   puts("SEARCH Canceled.\n");
   return;
  }
  printf("Choice >> ");
        scanf("%d", &choice);
        fflush(stdin);

        switch(choice)
        {
        case S_ITEM  : { Search_item(member);    break; }
        case S_NAME  : { Search_string(member, S_NAME);  break; }
        case S_PHONE : { Search_string(member, S_PHONE);  break; }
        case S_ADDRESS : { Search_string(member, S_ADDRESS); break; }
        case S_GROUP : { Search_string(member, S_GROUP);  break; }
        case S_MD  : { Search_MD(member, total);     break; }
  case S_EXIT  : { return; }
        }
 }
}


/* 검색 조건을 초기화 합니다. */
void Search_init(LIST *member)
{
 int i;
 for(i = 0; i < LIST_MAX; i++)
  member[i].searched = 0;
}


/* 검색된 결과를 출력 합니다. */
void Search_view(LIST *member)
{
 int i;

 puts("No.\t NAME\t PHONE\t ADDRESS\t GROUP\t");
 for(i = 0; i < LIST_MAX ; i++)
 {
  if(member[i].searched == 1)
  {
   printf("[%3d]\t %s\t %s\t %s\t %s\t\n",
    i+1, member[i].name, member[i].phone, member[i].address, member[i].group);
  }
 }
}


/* 항목 번호로 검색을 수행 합니다. */
void Search_item(LIST *member)
{
 int num;
 char decision;

 do
 {
  Search_init(member);
  printf("Item Number >> ");
  scanf("%d", &num);
  fflush(stdin);

  if(member[num-1].used == 0)
  {
   printf("[%3d] Item is Empty !!!\n", num);
   printf("Do you want item search continue? (Y/y) >> ");
   decision = getchar();
   fflush(stdin);
  }
  else
  {
   member[num-1].searched = 1;
   Search_view(member);
   printf("Do you want item search continue? (Y/y) >> ");
   decision = getchar();
   fflush(stdin);
  }
 }while(strchr("Yy", decision) != NULL);
}


/* 타이틀별로 검색을 수행 합니다. */
void Search_string(LIST *member, int s_title)
{
 char s_buf[255], decision;
 int i, cnt;

 do
 {
  cnt = 0;

  Search_init(member);
  printf("Search >> ");
  scanf("%s", &s_buf);
  fflush(stdin);

  for(i = 0; i < LIST_MAX; i++)
  {
   if(member[i].used != 0)
   {
    switch(s_title)
    {
    case S_NAME :
     {
      if(strstr(member[i].name, s_buf) != NULL)
      {
       member[i].searched = 1;
       cnt++;
      }
     }
    case S_PHONE :
     {
      if(strstr(member[i].phone, s_buf) != NULL)
      {
       member[i].searched = 1;
       cnt++;
      }
     }
    case S_ADDRESS :
     {
      if(strstr(member[i].address, s_buf) != NULL)
      {
       member[i].searched = 1;
       cnt++;
      }
     }
    case S_GROUP :
     {
      if(strstr(member[i].group, s_buf) != NULL)
      {
       member[i].searched = 1;
       cnt++;
      }
     }
    }
   }
  }

  if(cnt == 0)
  {
   printf("[%s] is not match !!!", s_buf);
   printf("Do you want search continue? (Y/y) >> ");
   decision = getchar();
   fflush(stdin);
  }
  else
  {
   Search_view(member);
   printf("Do you want search continue? (Y/y) >> ");
   decision = getchar();
   fflush(stdin);
  }
 }while(strchr("Yy", decision) != NULL);
}


/* 검색된 목록에서 리스트를 수정/삭제 합니다. */
void Search_MD(LIST *member, int *total)
{
 int i, flag=0;
 char decision, mode, choice, title;

 for(i = 0; i < LIST_MAX ; i++)
 {
  if(member[i].searched == TRUE)
  {
   flag = TRUE;
  }
 }
 
 if(flag == FALSE)
 {
  puts("Search result don't exist");
  system("pause");
  return;
 }

 else
 {
  do
  {
   flag = FALSE;
   Search_MD_Menu();
   printf("Choice >> ");
   mode = getchar();
   fflush(stdin);
   Search_view(member);

   if(mode == '1')
   {
    do
    {
     printf("Motify item choice >> ");
     choice = getchar();
     fflush(stdin);

     if(member[choice-'0'-1].searched == FALSE)
     {
      puts("This item is not searched.");
     }
    }while(member[choice-'0'-1].searched != TRUE);
    
    printf("\n\t\t1.NAME 2.PHONE 3.ADDRESS 4.GROUP\n");
    printf("Motify title choice >> ");
    title = getchar();
    fflush(stdin);
    
    Re_registration(member, choice - '0', title-'0'+1);
    printf("\nDo you want Motify item continue? (Y/y) or other keys >> ");
    decision = getchar();
    fflush(stdin);
   }
   else if(mode == '2')
   {
    do
    {
     printf("\nDelete item choice >> ");
     choice = getchar();
     fflush(stdin);

     if(member[choice-'0'-1].searched == FALSE)
     {
      puts("This item is not searched.");
     }
    }while(member[choice-'0'-1].searched != TRUE);

    printf("\nDo you want Delete? (Y/y) or other keys >> ");
    decision = getchar();
    fflush(stdin);

    if(strchr("Yy", decision) != NULL)
    {
     member[(choice-1) - '0'].used = 0;
     printf("\nDELETE Complete. <Total of list : %3d item.>\n", --*total);
    }
    else
    {
     puts("DELETE Canceled");
    }
    printf("\nDo you want Delete item continue? (Y/y) or other keys >> ");
    decision = getchar();
    fflush(stdin);
   }
   else return;
  }while(strchr("Yy", decision) != NULL);
 }
}


/* 리스트를 수정 등록 합니다. */
void Re_registration(LIST *member, int s_item, int title)
{
    int i;
    char group[5][10] = {"FAMILY", "RELATIVE", "FRIEND", "COLLEAGUE", "Ete."};
    char decision;

 printf("\nRegistration : [%3d]\n", s_item);
 switch(title)
 {
 case S_NAME  : {Contents_input("NAME\t", member[s_item-1].name);  break;}
 case S_PHONE : {Contents_input("PHONE\t", member[s_item-1].phone);  break;}
 case S_ADDRESS : {Contents_input("ADDRESS\t", member[s_item-1].address); break;}
 case S_GROUP : 
  {
   Contents_input("GROUP\t", member[s_item-1].group);
   do
   {
    for(i = 0; i < 5; i++)
     printf("\t%d. %s", i+1, group[i]);
    printf("\nGROUP\t>> ");
    scanf("%d", &i);
    fflush(stdin);
   }while (i < 0 && i > 6);
   
   strcpy(member[s_item-1].group, group[i-1]);
   break;
  }
 }
   
 printf("\nDo you want save? <N/n> or other keys >> ");
 decision = getchar();
 fflush(stdin);
 puts("");
 
 if( strchr("Nn", decision) != NULL )
  puts("MODIFY Canceled.\n");
 else
 {
  member[s_item-1].used = 1;
  puts("MODIFY Complete.\n");
 }
}

에디트 플러스에서 JAVA를 사용하기 위한 설정을 해 보자.

1. 에디트 플러스 실행

  도구 -> 사용자 도구 구성 -> 추가 ->

2. 에디트 플러스 컴파일 단순 설정하기

  - 저 같은 경우는 메뉴제목은 javac (컴파일할때 쓰이는 실행파일)로 했습니다.

    메뉴 제목이므로제목은 마음대로 써도 좋습니다.

  - 명령은 옆에 ... 을 클릭 javac파일이 있는곳을 찾아가서 클릭

  - 보통 C:\Program Files\Java\jdk1.5.0_07\bin <- 이 폴더에 있죠!

  - 인수 = $(FileName)

  - 디렉토리 = $(FileDir)

  - 밑에 출력내용캡쳐 체크.

 

3. 에디트 풀러스 실행 단순 설정하기

  - 저 같은 경우는 메뉴제목은 java (컴파일된 java파일을 실행하는파일)

    메뉴제목이므로 제목은 마음대로 써도 좋습니다.

  - 명령은 옆에 ... 을 클릭 java파일이 있는곳을 찾아가서 클릭

  - 보통 C:\Program Files\Java\jdk1.5.0_07\bin <- 이것도 같은 폴더!

  - 인수 = $(FileNameNoExt)

  - 디렉토리 = $(FileDir)

설정 끝입니다.

 

실행하는 단축키는 Ctrl+순서대로입니다.

사용자도구 구성의 도구이름 순서대로니깐 맨 위에 있는것이 1입니다.

즉, 위와 같이 설정시 컴파일이 Ctrl+1, 실행이 Ctrl+2 입니다.


Let's talk about the now and future of Query by Humming(QbH). I don't want to talk about the past because there was nothing in the past. Now computer scientists are researching QbH, and I think it will be a dream technology in the future.


How far we've gone so far? Let me give real examples. In 2004, KTF(the one of Korean mobile companies) started "Search Music" service, and Verizon(the one of US mobile companies) also started "SongID" service.

http://www.muncle.com/media/mobile_news_view.jsp?seq=1396
“노래 들을 준비됐니?”라는 카피와 함께 가수 서태지의 미발표 신곡이 흐르면서 광고는 시작합니다. 시청자가 ‘휴대전화를 꺼내고’ ‘1515+통화버튼을 누른다’ ‘휴대전화를 TV에 가까이 댄다’ 등 광고 중간중간 나오는 지시를 따르면 신기하게도 휴대전화에 곡명이 뜨고, 노래를 다운받을 수 있습니다. (음악을 6초 이상 들려줘야 검색이 가능)
...KTF has promoted with Seo Taiji, who has the most powerful fandom. He released a new song through this service, but even his fans haven't used this service.

http://www.fiercemobilecontent.com/story/verizon-launches-song-identification-service/2007-05-20
Verizon Wireless announced V Cast Song ID, a new service enabling subscribers to identify a piece of music by capturing a 10-second sample via mobile handset and seconds later receiving title and artist information as well as corresponding download, ringtone and ringback offers.
...This is almost the same of KTF "Search Music". Have you ever heard this service? Maybe not.

And Bugs Music also released "Humming Search" service in October 2007, but it has closed in March 2008.


Why these services were unpopular? Why were they unsuccessful? As I used them, their performance were poor. They possibly find my songs, but not so great.

What are the problems?


1. Singers may sing incorrectly
2. There may be noise when singing
3. The program may abstract the voice to the note incorrectly
4. The program may search incorrectly
5. The Music DB may be too small or incorrect

Among these possible problems, we want to focus on searching way. we don't care noise and the abstraction from the wave sound to the note because they have already researched enough.

I think the abstraction of data to meta data is similar to MPEG-7. Actually, QbH is already included to MPEG-7 standard, it's just a provision though.

http://en.wikipedia.org/wiki/Query_by_humming

What is MPEG-7? It makes machine read audio and video. For example, we can read the jpg file and know it's Beckham, but computers can't. So we add meta-data indicates this part of the jpg file is Beckham.



MPEG-7 is similar to the Semantic Web, abstracting meta-data from data. They try to abstract semantic meanings like "It's Beckham!" from the binary data, but I'm afraid whether it's possible.


Back to QbH, we can divide vocal abstraction in two parts, the soft part and the hard part. We can abstract the wave data to the note data easily, but it's still hard to abstract the note to the semantic data like "It's Beckham!".


I'll talk how they are soft and hard in the next article.


 -프롬프트 -> minicom (엔터)-

 1. setip, sethost, setmac, setenv, netopen 수행

 2. 1.번을 수행했다면 바로 netopen

 3. tftp zImage 0x31000000 (엔터)

 4. tftp ramdisk4.gz 0x30600000 (엔터)

 5. run 0x31000000 (엔터)

 6. ID : root // PW : yan2041

 7. ifconfig eh0 10.40.1.107 netmask 255.255.255.0 (엔터)
   (위에서 10.40.1.107은 네트워크에 연결된 자신의 보드 IP)

 8. route add default gw 10.40.1.254 (엔터)

 9. route (엔터) - 라우터를 확인

10. cd /mnt/nfs (엔터)

11. ls (엔터)
    (현재 폴더에 gendisk.ko와 gpio.ko가 있는지 확인!)
    (없거나, 허가 거부가 뜬다면, 직접 /home/계정ID/driver로 이동 후, 
     각 gendisk와 gpio폴더에서 cp  gpio.ko /nfs (엔터) 와 cp gendisk.ko /nfs (엔터)를 쳐서 이동 시킴)

12. insmod gpio.ko (엔터)

13. insmod gendisk.ko (엔터)

14. lsmod (엔터)

15. mkfs.ext2 /dev/gen (엔터)

16. mount /dev/gen /mnt/hda (엔터)

17. mount (엔터) - 제대로 되었는지 확인 함.

-------------------------------------------------------------------------------
금요일은 우선 여기 까지 확인!

(문제) R명의 사람이 있다. 사람들 사이에는 서로 친구이거나 서로 적인 관계가 성립하고 있다. 그렇다면 만약 R명의 사람이 존재하기만 한다면 이중에서 3명은 서로 친구이거나 3명이 서로 적인 경우가 반드시 존재한다고 한다. 이 경우 R의 최소 값은 얼마이겠는가?

위와 같은 문제가 주어졌다. 위 문제는 Ramsey Number를 제기하는 가장 기초적인 문제로써 비둘기 집의 원리로써 쉽게 해결 할 수 있다. 한편 여기서 3명이 서로 친구(mutual friends)란 말은 (대칭적으로 서로 적이란 말에도 성립한다.) 이 3명중에서 아무나 두 명을 선택했을 때 그 두 사람은 반드시 친구인 경우인 경우를 말한다.

(풀이)

사람이 총 n명이 있다고 가정하자. 그리고 각 사람들을 점(point)으로 두고 그 사람사이의 관계를 선(edge)으로 연결하자. 이 n 개의 점을 모두 다 이은 모양의 그래프(Graph)를 Complete graph of order n (Kn)이라고 한다. 이제 이 그래프의 선분들은 2가지색으로 Coloring을 할 수 있고, 그 색들은 각각, 친구, 적이라는 의미를 가진다고 생각하면 위 문제는 변의 색이 모두 같은 삼각형을 찾는 문제로 변형이 된다.

먼저 R>5 임을 보이자. 이것은 반례를 보이면 쉽게 증명된다.

R=5 ; Counter Example.


R=6 : 한 사람(A)에 대해서 생각하자. Pigeonhall Principle 에 의해서 나머지 다섯 사람 중에는 적어도 세 사람 이상이 A와 친구이거나 적이고, 대칭적으로 세 사람이 친구라고 한다면 이 사람들끼리 친구 사이가 존재하면 그 두 사람과 A는 서로 친구 사이. 만일 이 세 사람이 모두 적이라면 서로 적인 경우가 되므로 적어도 R이 6이상 이라면 반드시 세 명이 서로 친구이거나 서로 적인 경우가 존재한다. 따라서 R의 최소 값은 6이다. □

(Definition) R명의 사람이 있을 때 m명이 서로 친구이거나 (mutual friends), n명이 서로 적인 경우(mutual enemies)인 경우가 반드시 생긴다고 할 때, R의 최소값을 Ramsey Number R(m,n) 이라고 정의한다.

일반적으로 Ramsey Number 의 구체적인 값에 대해서는 알려져 있지 않다. 대신에 몇몇 특수한 값들에 대해서는 이미 밝혀지고 증명이 되어 있다. 필자는 이번 원고에서 R(4,4)=18 임을 증명하려 한다.

Lemma 1) R(3,3) = 6

위에 증명되어 있다.

Lemma 2) R(4,3) = 9

(풀이)

먼저 R(4,3) > 8 임을 보이자. 이것은 R=8 일 때 4명이 서로 친구이거나 3명이 서로 적일 경우가 꼭 생기지 않는 반례를 보이면 증명이 된다. 왜냐하면 R=8 일 때 반례가 존재하면 R<8 일 때 역시 R=8 일 때의 예에서 사람을 한 명씩만 줄이면 그것이 각각의 반례가 되기 때문이다. 친구를 실선, 적을 점선으로 연결한다고 하면 R=8 일 때 다음과 같은 반례가 존재한다.


이제 R(4,3)<= 9 임을 보이자.

어떤 한 사람 A를 기준으로 친구가 6명 있다고 가정하자. 그러면 Lemma 1에 의해 이 6명 중에는 반드시 서로 친구인 세 사람이 있거나 적인 세 사람이 존재한다. 서로 적인 세 사람이 존재한다면 R(4,3)의 정의에 만족하고, 서로 친구인 세 사람이 존재한다면 A와 함께 서로 친구인 네 사람이 존재하는 것이 된다. 따라서 증명 끝.

또한 A와 적관계인 4 사람이 존재한다고 가정하자. 그러면 이 사람들 중에 서로 적인 두 사람이 있다면 A와 함께 서로 적인 세 사람이 존재하는 것이다. 그런 관계가 없다면 정의에 의해 이 네 사람은 서로 친구가 되는 것이다. 따라서 9명의 사람이 있을 때, 어떤 한 사람도 친구가 6명 이상이거나 적이 4명 이상이면 반드시 네 명이 서로 친구이거나 세 명이 서로 적인 경우가 반드시 생기게 된다.

9가 R(4,3)을 만족하지 않을 반례가 존재하기 위해선 9명의 사람 모두가 5명의 친구, 3명의 적을 가지고 있어야 한다. 즉, 위와 같은 그래프에서 각 점에 실선이 모두 5개여야 한다는 말이다. 점과 실선(edge)만으로 이루어진 Simple Graph 를 생각하면,

2e = Σdeg(v) (e는 edge 의 개수, deg(v) 는 각 꼭지점에 연결된 edge의 개수)

가 성립하는 데, deg(v)=5 이고 |v|=9 이므로, 2e = Σdeg(v) = 9×5 = 45 이다.

하지만 45는 홀수 이므로 모순. 따라서 그러한 예는 존재하지 않는다. 따라서 반드시 누군가 한 명은 6명 이상의 친구를 가지고 있거나 4명 이상의 적을 가지고 있어야 한다. 따라서 9명의 사람이 있으면 반드시 네 명이 서로 친구이거나 세 명이 서로 적인 경우를 찾을 수 있고 R(4,3)>8 에서, R(4,3)=9 이다.□

Lemma 3)

R(m,n) = R(n,m)

Lemma 4)

R(n,2) = n = R(2,n)

(증명) Lemma 3와 Lemma 4는 자명하다.

Theorem) Ramsey's Theorem.

Claim. R(m,n) ≤ R(m-1,n) + R(m,n-1) for m, n(>2) ∈ N

pf) n명의 사람이 있다고 하자. 그 중에서 임의의 고정된 한 사람 A를 잡고 각 사람들 사이의 관계를 선으로 표시하자. 즉, 친구일 때는 붉은 색을, 적일 때는 푸른색의 선분을 칠한다고 생각하자. 만일 붉은 색이 선분이 R(m-1,n) 개 이상 있다고 하면 그 사람들이랑 A 와 함께 존재해서 R(m,n) 이 만들어진다. 비슷하게 푸른색이 R(m,n-1) 개 이상 있다고 하면 역시나 A와 함께 R(m,n) 이 만들어진다. 따라서 어떤 고정된 사람 A에 대하여 총 (R(m-1,n)-1)+(R(m,n-1)-1)+1 개의 관계를 가진 사람들이 존재하면 그 Pigeonhall Principle에 의해서 R(m-1,n) 개의 붉은 색 선분이나 R(m,n-1) 개의 푸른색 선분을 가진 사람들이 존재하고 따라서 이 수는 R(m,n) 보다 크다고 할 수 있다. . □

이제 R(4,4) 가 18임을 증명하자.

Ramsey Theorem 에 의해 R(4,4) ≤ R(4,3) + R(3,4) 이 성립하고 Lemma 2와 Lemma 3에 의해 R(4,4) ≤ R(4,3)+R(3,4) = 2R(4,3) = 18 이 성립한다. R(4,3)>17 임을 보이기 위해선 R=17 일 때, 반례가 있음을 보이면 된다. 이것은 그다지 어렵지 않기 때문에 숙제로 남긴다. 여러분들이 한번 찾아보길 바란다.

이상 우리는 간단하게나마 Ramsey Number 에 대해서 알고 몇 가지 경우에 대해서 Ramsey Number 를 직접 찾고 증명해 보았다. 또한 우리는 R(4,4)=18 임을 증명할 수 있었다. 마지막으로 현재까지 밝혀진 Ramsey Number 에 대한 표는 다음과 같다.

l

k

3

4

5

6

7

8

3

6

9

14

18

23

27/30

4


18

25/28

34/44



5



42/55

51/94



6



69/102



References

1. 「Ramsey Theory」, Ronald L. Graham, Bruce L. Rothschild, Joel H. Spencer (1980 ; John Wiley & Sons, Inc)

2. 「Discrete Mathematics and Its Applications」, Kenneth H. Rosen
  (4th ed ; VAGA, New York)

출처 : http://math.kaist.ac.kr/%7Edeneb/study/Ramsey_Numbers.htm


출연자소개 / 스토리
무기타 나츠미(?田なつみ) : 다케우치 유코(竹?結子)
23세. 양식집 <키친 마카로니>에 찾아온 미녀. 어릴 때 어머니를 여의고 아버지와 헤어져 혼자 살아온 나츠미. 10대 때에는 나쁜 친구들과 어울렸고, 고등학교를 중퇴한 후에는 아르바이트를 전전하는 생활을 해왔다. 카페에서 일하며 맛있는 점심을 먹는 것을 기뻐한다. 다른 사람을 쉽게 동정하며, 한번 뜻을 정하면 쉽게 굽히지 않는다. 무엇이라도 열심히 하지 않으면 안 되는 성격. 요리의 경험은 거의 없다. 어릴 때 아버지가 데리고 갔던 양식집의 오므라이스 맛을 잊지 못하고 그 느낌을 가슴에 묻어두고 산다.
나베시마 켄이치로(鍋島健一?) : 츠츠미 신이치(堤?一)
34세. 나베시마 가문의 장남. 대학 졸업 후 회사를 경영하지만 성공과 실패를 거듭한다. 2년 전 가게의 개업 자금 500만 엔을 가지고 집을 나가버린 채 행방불명. 가출 후에 새로운 사업에 손을 대지만 실패. 무직으로 친구의 집을 전전하며 살아가지만 어떻게든 집에 돌아갈 기회를 만들려고 한다. 대단히 화통한 성격으로 설득력을 지닌 입이 무기. 여성관계에 있어서는 능력이 있지만 오래 가지는 못한다. <키친 마카로니>의 경영에는 일절 관심이 없다. 나츠미가 일하는 카페에 출입하며, 나츠미와는 얼굴만 아는 정도
나베시마 유지로(鍋島勇二?) : 에구치 요스케(江口洋介)
31세. 나베시마 가문의 차남. 대학 졸업 후 무책임한 형과는 달리 <키친 마카로니>에서 일하고 있다. 경영면을 맡아 누구보다도 가게를 사랑한다. 수지가 맞지 않는 런치를 그만두고 싶어하는 마음도 있지만 한 가지 맛을 계속 지켜가는 것의 중요성을 이해하고 있다. 생각하고 있는 것은 직접적으로 말하며 행동하기 때문에 뒤에 후회하는 일이 많다. 다른 사람의 아내와 교제 중. 나츠미와는 번번히 부딪히나 나츠미의 본심을 누구보다 잘 알고 있다.
나베시마 준자부로(鍋島純三?) : 츠마부키 사토시(妻夫木?)
23세. 나베시마 가문의 3남. 고등학교 졸업 후 <키친 마카로니>에서 일하고 있다. 요리사로서는 아직 수업 중이지만 재료를 선정하는 눈과 맛의 센스는 아버지에게서 그대로 물려받았다. 형 유지로로부터는 매일 구박을 받고 동생에게는 늘 먹히는 중간의 약한 형제. 우유부단하며 성실하고 부드러운 성격이지만 심지가 굳다. 그다지 사교적이지 못하지만, 연애에는 순정파. 나츠미를 호의적으로 받아준다.
나베시마 코시로(鍋島光四?) : 야마시타 토모히사 (山下智久)
18세. 나베시마 가문의 4남. 도립 고등학교 3학년. 가게의 일은 가끔 돕는 정도로 가업을 잇는 것에는 그다지 흥미가 없다. 낙천적인 성격. 가족에 대해서는 일정한 거리를 두고 있다. 노력하지 않아도 공부를 잘 하지만 무슨 일에든 끈기가 없다. 동갑내기인 미노루와는 친구.
나베시마 곤조(鍋島?造) : 모리타케 히사아키(森武久明)
58세. 도쿄의 닌교마치에 있는 양식집 <키친 마카로니>의 주인. 오래전부터 양식집에서 일하였으며, 30년 전에 아내와 둘이 가게를 열었다. 이후 데미그라소스를 시작으로 처음의 맛을 고집스럽게 지켜 온다. 아내와 사별 후 4형제를 기르면서 가게를 경영해 왔다. 가업과 가족을 사랑한다. 자식들이 선택해 가는 길에 간섭하지 않다. 그다지 말이 없지만, 무관심하지는 않다. 전형적인 직인(職人)의 기질을 지님.
규시마 미노루(牛島ミノル) : 야마타 다카유키(山田孝之)
18세. 고등학교 중퇴하고, 혼자 도쿄에 와 있다. 중학교 때 <키친 마카로니>의 오므라이스를 먹고 그 맛에 감동해 이 일을 선택한다. 1년 반 전부터는 요리 견습생으로 나베시마 집에 함께 살면서 일하고 있다. 장래에는 자신의 가게를 열고 싶다는 큰 꿈을 꾸고 있다. 나츠미의 과거를 알고 있다.
시오미 토마토(?見トマト) : 이토 미사키(伊東美?)
25세. <키친 마카로니> 근처에 있는 야채가게 <시오미>의 딸. 나베시마 가문에 대해 어릴 때부터 잘 알고 지내왔고, 형제들과도 사이가 좋다. 매일같이 <키친 마카로니>에 싸고 좋은 야채를 배달하고 있다. 밝고 남을 잘 보살피는 성격으로 연애에도 적극적. 준자부로를 좋아해 나츠미를 라이벌로 생각한다.
** 스토리 ****

드디어 2002년 여름 새 드라마가 시작되었다!! 그 스타트를 끊은 것은 후지TV의 [런치 여왕]! 남자들이 경영하는 [키친 마카로니]에 한 미인이 찾아오면서 시작되는 러브 스토리와 요리에 대한 자부심 등 인간미 넘치는 스토리가 전개 된다!!

나베시마(鍋島)가의 장남 켄이치로((健一郞)-츠츠미 신이치(堤眞一)분)의 부탁으로 약혼자로 위장하여 그의 집인 [키친 마카로니] 로 함께 오게 된 무기타 나츠미((麥田なつみ)-케우치 유코(竹內結子)분).
그러나 켄이치로는 나베시마 집안의 수치였다.
예전에 가게의 개장비를 가지고 도망쳤던 것이다. 켄이치로를 형으로 인정하지 않는 유지로((勇二郞)-에구치 요스케(江口洋介)분). 그리고 형을 환영하는 셋째 쥰자부로((純三郞)-츠마부키 사토시(妻夫木總)분)와 넷째 코지로. 그리고 그다지 말이 없는 아버지

이제 새로운 각오로 다시 시작하고 싶다고 말하는 켄이치로였지만 그는 또 가게의 돈을 가지고 모습을 감추어 버린다.

혼자 남겨져 당혹함을 감추지 못하는 나츠미였지만 왠지 [키친 마카로니]가 마음에 든 모양이다. 그런 소동이 있은 다음 날 나츠미는 [키친 마카로니]에서 일해 보고 싶다고 다시 나타난다.
나베시마 가의 가족들이 알고 있는 것은 나츠미가 켄이치로의 약혼자라는 사실 뿐이다. 그런 이유만으로는 채용을 해 줄 수 없다고 강력하게 반대하는 유지로로부터 쫓겨 나지만 절대 포기하는 않은 나츠미는 그날 밤 다시 한번 더 나베시마가로 찾아 간다. 어쨌든 하루 밤 묵을 수 있게 허락 받은 나츠미…

쥰자부로와 코시로는 유지로와는 달리 나츠미의 출현을 기뻐하고 있다.
결국 다음날 아침부터 나츠미는 [치킨 마카로니]에서 일하게 된다. 단지 유지로만 냉정한 태도로 한가지 제안을 한다.

"세 번 실패를 하면 당장 가게를 나가야 한다 " 라는 조건을 내거는데…

** 리뷰 ****

개성 넘치고 멋있는 남자들이 열심히 일하는 한 양식집. 그곳은 맛있는 것을 먹는 기쁨으로 작은 행복을 느낄 수 있는 공간이었다. 그러던 어느 날 양식집에 갑자기 한 미녀가 나타난다. "런치의 여왕" 무기타 나츠미(麥田なつみ). 그녀로 인해 복잡하고 진한 "가정 내 연애"가 일어난다!

이 작품에서는 연애 이야기는 물론이고, 새로운 것을 원하거나 많은 것을 손에 넣는 것에 열중하는 경향이 있는 현대 사회에서, 자신이 있어야 할 곳을 지키면서 한가지 일을 꾸준히 해 나가는 것의 중요함이 주제가 되고있다.

등장인물에는 주연을 맡게 된 다케우치 유코(竹內結子)를 비롯해, 주연 영화「워터 보이즈(ウォ-タ-ボ-イズ)」로 인기를 얻었던 츠마부키 사토시(妻夫木聰), 베테랑 배우인 에구치 요우스케(江口洋介) 등이 출연해 화제를 모으고 있다.

또한 주목해야 할 것은 이야기 중에 나오는 수많은 요리들. 드라마에 나온 요리들은 공식 홈 페이지에서 그 요리 방법을 실제로 배울 수도 있다는 것이다. 오므라이스, 햄버그 스테이크 등 양식집의 인기 매뉴가 시청자들의 식욕을 자극할 것이다.

출처: 일본으로가는길 (http://www.tojapan.co.kr/)

출연자소개 / 스토리
노다 메구미 (21세) (野田?) : 우에노 주리 (上野樹里)
모모가오카 음악 대학 피아노과의 학생. 통칭 노다메. 괴성을 지르거나 방에 쓰레기를 모아두는
등, 괴팍한 버릇을 가지고 있는 트러블 메이커. 바탕은 상냥하지만, 변덕이 심하고 자유분방한
 낙천주의자이기도 하다. 음악을 한번만 듣고도 똑같이 연주 할수 있는 천재적인 일면을 가지면서,
 악보를 읽는 것이 골칫거리. 본능이 향하는 대로 연주하는 초절정의 연주는, 작곡자의 의사를
무시하고 폭주하는 일도 자주. 취미는 애니메이션 감상등... 후쿠오카 출신.
치아키 신이치 (21세) (千秋?一) : 타마키 히로시 (玉木宏)
모모가오카 음악 대학 피아노과의 학생. 음악가 집안에서 태어나 바이올린, 피아노는 프로급의
솜씨. 대학에서는 피아노과에 재적하면서도, 은밀하게 지휘자를 목표로 하고, 독학을 계속하지만,
 실은 비행기 공포증 때문에, 해외에 가는 것조차 할 수 없는 불우의 천재이기도 하다. 완벽 주의자로,
 왕자님 캐릭터. 그러므로, 학내에서도 「치아키님」이라고 불리고 있지만, 그 지적이고 쿨한 모습
과는 정반대로, 박애 정신이 풍부해, 도움 주기를 좋아하는 사람. 특기는 요리, 어학, 사교 댄스.
프랑스 태생
슈트레제만 (シュトレ?ゼマン) : 타케나카 나오토 (竹中直人)
모모가오카 음악대학 이사장의 의뢰로 일본에 방문한 세계적인 지휘자. 통칭 밀히. 노는걸
좋아하고,미팅과 카바레식 클럽이라면 껌뻑 죽는 에로아저씨 이기도 하다. 노다메와 치아키의
 운명을 크게 바꾸는 것에... 독일 출신.

*** 등장인물차트 ****


 

연출 : 타케우치 히데키
프로듀서 : 와카마츠 히로키, 시미즈 카즈유키
각본 : 에토 린
원작 : 니노미야 토모코
제작사 : 후지TV
공식홈피: http://wwwz.fujitv.co.jp/nodame/

*** 스토리 ****

노다 메구미는, 모모가오카 음악대학 피아노과 3학년. 음악을 한번만 들어도 똑같이 연주할수 있는 천재적인 일면을
지녔으면서도, 악보를 읽는 것이 대단히 서투르고, 작곡자의 의도를 무시하고 연주를 해 버리기도 한다.

한편, 같은 피아노과의 4학년·치아키 신이치는, 피아노나 바이올린 연주 수준은 프로급. 지휘자를 목표로 하고 있어,
아무도 모르게 공부를 계속하고 있던 치아키는, 비행기 공포증 탓으로 해외 유학조차 마음대로 다니지 못하는 불우의 천재
이다. 자기보다 실력이 떨어지는 학생들이 해외에서 유학하는 것을 알게된 치아키는, 엘리트 전문의 피아노 교사·에토
코조에게 반항하다, 콩쿨 출장을 취소당하게 되어버린다.

그날밤, 치아키는, 연인이기도 한 성악과의 타가야 사이코와 한잔하러 나갔지만, 너무 만취해버린 나머지 약한소리를
늘어놓아, 그녀에게 버림받아 버린다.

다음날 아침, 치아키는, 쓰레기 투성이의 맨션의 방에서 눈을 뜨게 되는데....

*** 드라마 뉴스 ****

클래식 음악계의 세계를 코믹하게 그려 1100만 부라는 누계판매부수를 달성한 인기 만화 <노다메 칸타빌레
(のだめカンタ-ビレ)>가 후지TV를 통해 연속극으로 제작된다. 새로운 게츠구(月9)로 10월 16일부터 시작되는 것으로,
주인공인 천재 피아니스트 '노다메(のだめ)' 노다 메구미(野田惠)를 우에노 쥬리(上野樹里, 20)가, 그녀가 한 눈에 반하는
 선배를 타마키 히로시(玉木宏, 26)가 연기한다.

<노다메 칸타빌레>는 2001년 7월에 잡지 [KISS]에 연재를 시작한 니노미야 토모코(二ノ宮知子) 작가의 인기 만화로
문턱이 높은 클래식 음악의 세계를 개성적인 캐릭터로 코믹하게 그리고 있는 작품. 작품에 나오는 곡을 모은 음반의 발매와
 연주회 등도 열리는 등 붐을 이루고 있는데 드라마화는 몇년 전부터 팬들의 요청이 강했던 만큼 방송국들의 쟁탈전 끝에
 후지에게 돌아갔다. 현재 '게츠구' 시간대에 방송 중인 <사프리(サプリ)>가 평균시청률 14% 전후로 부진한데 화제작의
드라마화로 시청률 회복에 나선다는 계획이다.

주인공 '노다메'는 음대에서 피아노를 전공으로 하는 여대생. 음악을 한번만 들으면 그대로 연주할 수 있는 천재성을
지녔으면서도 악보를 잘 읽지 못하는 약점을 지니고 있다. 게다가 목욕과 청소를 싫어해서 방은 먼지투성이. 연애 드라마가
많은 '게츠구'에서도 이례적이라고 할 수 있는 강렬한 캐릭터에 영화 <스윙걸즈(スウィングガ-ルズ)>에서 섹소폰에
몰두하는 여고생을 열연했던 우에노가 발탁됐다. 또한 노다메가 좋아하는 음대 선배이자 피아노과에 다니며 지휘자를
목표로 하는 꽃미남 완벽주의자 치아키 신이치(千秋眞一)를 타마키가 연기한다.

우에노는 "원작 만화가 너무 재미있어서, 드라마도 그에 지지 않기 위해 끝까지 파워풀하면서도 따뜻한 마음으로 최선을
 다하겠다"고, 타마키는 "피아노, 바이올린, 지휘 모두 처음 경험하는 일이라 지금 맹훈련 중이다. 혼신을 다해 치아키를
 연기하겠다"는 포부를 밝혔다. 이밖에 원작에서는 독일인으로 나오는 세계적인 지휘자를 다케나카 나오토(竹中直人, 50)가
 연기하는 것을 비롯해 노다메의 주변 사람들로 에이타(瑛太, 23), 미즈카와 아사미(水川あさみ, 23), 코이데 케이스케
(小出惠介, 22), 우에하라 미사(上原美佐, 22) 등 참신한 젊은 배우들이 대거 등장한다.

출처: 일본으로가는길 (http://www.tojapan.co.kr/)





출연자소개 / 스토리
쿠니미 히로 (?見比呂) - 야마다 타카유키 (山田孝之)
세이난 중학교 시절 에이스 투수로서 히데오등과 활약. 지구 대회에서 연속 우승한 기록을 가지고
있다. 그러나 의사에게 「이대로 계속 던지면 3개월에 팔꿈치가 망가진다」는 말을 듣고 야구를
단념. 야구부가 없는 센카와 고등학교에 입학한다. 하지만, 후에 그 의사는 돌팔이 의사로 팔꿈치는
 전혀 이상이 없는 것이 판명. 그리고 센카와 고등학교에 야구부를 만들어 한번 더 야구의 길을
 걷기 시작한다.
코가 하루카 (古賀春華) - 이시하라 사토미 (石原さとみ)
센카와 고등학교에서 히로의 동급생. 말괄량이에 덜렁이, 그리고 천연덕스럽기까지 한 삼박자 갖춘
여자 아이. 그런데 성적은 우수. 운동신경은 제로. 스포츠는 하는 것보다 보는편을 좋아해 어릴 적
부터 고교 야구의 팬. 고교 입학 후는, 야구 애호회의 매니저를 자진해서 하고, 결국은, 히로의 멤버들
과 함께 야구부까지 만들어 버린다. 그렇다고 주제 넘지도 않아, 요즘 드문, 남자의 기를 세워줄 줄
아는 고풍스러운 타입의 여자아이.
타치바나 히데오 (橘英雄) - 타나카 코타로 (田中幸太朗)
사립 메이와 제일고등학교의 야구 부원. 1학년으로 3루수에 4번을 친다. 세이난 중학교 시절부터
히로나, 노다와 같은 팀에서, 에이스 강타자로서 전국의 주목을 끌고 있었다. 옛부터 상당한 핸섬해서
인기있는 남자 아이지만, 지나칠 정도로 아마미야 히카리에게 목숨을 건다. 꿈은 프로야구 선수가
되어, 여러 가지 기록을 바꿔 가는 것. 히로와는 영원의 라이벌이지만, 히로의 대단함, 재능을, 누구보다
 제일 인정하고 있는 히로인 팬.
아마미야 히카리 (雨宮ひかり) - 이치카와 유이 (市川由衣)
사립 메이와 제일 고교생으로, 히데오와 동급생. 현재 궁도부 소속(가끔, 야구부의 돕는 매니저?).
히로와는 어릴적 부터 친구로, 가족 모두와 알고 지낸다. 중학생 시절부터 히로의 소개로 히데오와
사귀고 있다. 침착한 분위기로, 착실한 누나 타입. 장래의 꿈은 스포츠 기자가 되어, 스포츠 기사,
특히 야구의 기사를 쓰는 것. 히데오를 좋아하지만, 히로도 그대로 둘 수 없다.
키네 류타로 (木根?太?) - 이시가키 유마 (石垣佑磨)
센카와 고교 야구 부원. 중학생 시절 에이스 스트라이커로서 이름을 날렸지만, 센카와 입학 후는 히
로와의 만남으로 야구부에 입부. 초등학생 시절, 에이스로 4번이었던 리틀 리그에서 히데오에게
주수와 에이스의 자리 양쪽 모두 빼앗겼다고 하는 굴욕적인 과거를 가진다. 본인은 상당한 잘났다고
 생각하지만, 주위는 그렇게는 생각하지 않는듯... 입학한 이래, 하루카를 좋아해 열성적으로 접근
하지만, 그녀는 언제나 냉정하게 군다. 대단히 튀고 싶어하는 아이.
노다 아츠시 (野田敦) - 나카오 아카요시 (中尾明慶)
센카와 고교 야구 부원. 히로와는 초등학교 4학년 때부터 배터리를 짜는 안경 쓴 포수. 히로나 히카
리와는 어릴적 부터 친구. 허리를 다쳐 히로와 같이 야구를 단념하고 센카와 고등학교에 입학하지만
, 역시, 허리 진단을 한 의사는 히로의 팔꿈치를“유리 팔꿈치”라고 진단한 가짜 의사. 결국, 히로와
같이 허리는 아무 이상도 없고, 그리고는 야구에 거는 히로를 응원하기 위하여, 자신도 다시 야구의
 길로 돌아온다. 냉정한 판단력, 두뇌로, 포수로서 의지할 수 있는 아내 역할. 히로나 히데오에게서
신뢰받고 있는 두 명에게 있어 좋은 이해자.
** 스토리 ****

사립 센카와 고등학교에 입학한 히로와 노다는, 2년 연속 중학 관동 대회에서 우승한 황금 배터리. 그러나 히로는 의사로
부터 「망가지기 쉬운 팔꿈치」라고 진단되고 야구를 단념, 두 명은 굳이 야구부가 없는 고등학교를 선택했다.

그후, 히로는 축구부에, 노다는 사진부에 입부했다. 어느날, 히로는 야구볼을 안고 있는 하루카와 만나면서 센카와
고등학교에 「야구 애호회」가 있는 것을 안다.

한편, 히로의 라이벌, 히데오는 사립 메이와 제일 고등학교에 진학해, 기대의 별로서 야구부의 환영을 받고 있었다.
히로의 친구이며 히데오의 여자친구, 히카리도 메이와 고교에서 히데오의 활약을 응원하고 있다.

하루카에게 끈질기게 찝쩍대는 축구부의 키네는, 야구 애호회의 연습 시합 상대가 없는 것을 알고, 축구부가 연습 상대가
 되어 줄 것을 제안한다 . 만약, 애호회가 시합에서 지면 그라운드의 사용을 인정하지 않는다고 하지만, 하루카는 그 조건을
시원시럽게 받아드린다.

시합 당일, 히로는 축구부의 멤버로서 오랫만에 야구를 한다. 투수 키네의 공을 가볍게 잡아, 주위를 깜짝 놀라게 하지만,
왠지 던지는 볼은 힘이 없다. 팔꿈치를 신경쓴 탓. 시합은 축구부 우세로 점점 더 점수 차이가 날뿐.

그러나 히로는 키네가 야구를 무시 하는 행동에 마침내 축구부를 그만둔다고 말하고 그 자리에서 야구 애호회에 들어간다.
 파트너 노다도 같은 마음이다.

드디어 황금 배터리(투수와 포스)의 부활이다!

** 드라마 소개 ****

만화 <터치(タッチ)>의 작가 아다치 미츠루(あだち充)씨의 대표작 중 하나인 <에이치2(H2)>가 내년 1월부터 TBS를
 통해 연속극으로 방영된다. 드라마 제목은 <에이치2~너와 있던 날들~(H2~君といた日?~)>. 주인공 쿠니미 히로
(國見比呂) 역에는 야다마 타카유키(山田孝之, 21)가, 여주인공 코가 하루카(古賀春華) 역에는 이시하라 사토미(
石原さとみ, 17)가 각각 캐스팅됐으며 드라마 <세상의 중심에서, 사랑을 외치다(世界の中心で, 愛をさけぶ, 이하
세상의 중심)>에 이어 츠츠미 유키히코(堤幸彦) 감독이 야마다와 손 잡고 연출을 맡는다.

원작은 1992년부터 99년까지 [주간소년선데이(週刊少年サンデ-)]에 연재되며 인기를 모은 만화로, 단행본 총 34권은
4800만 부나 판매됐다. 갑자원(甲子園)을 목표로 하는 초고교급 투수 히로와 친구이자 라이벌인 천재 타자 타치바나
 히데오(橘英雄)의 우정을 중심으로 히로의 소꼽 친구이자 히데오의 여자 친구인 아마미야 히카리(雨宮ひかり),
히로를 좋아하는 하루카의 러브스토리가 전개되는 청춘물이다.

드라마는 원작의 코믹한 부분을 그대로 살려 밝으면서도 애틋한 청춘 드라마로 제작될 계획이다. 이를 위해
<케이조쿠(ケイゾク)>와 같은 독특한 감각과 <세상의 중심>와 같은 애절한 러브스토리를 성공적으로 연출해 온
츠츠미 감독이 연출로 기용됐다. <세상의 중심>에 이어 연속 츠츠미 감독의 드라마에 주인공으로 캐스팅된 야마다는
"이번에는 츠츠미 월드에 익숙해진 만큼 즐겁게 임하고 싶다"고 말했으며 여주인공 역의 이시하라는 "같은 또래
연기자들이 많으니 무엇보다 팀워크를 중요시하겠다. 츠츠미 감독의 작품을 평소 좋아했기 때문에 출연하게 돼
기쁘다"고 밝혔다.

출처 : http://www.ilbondrama.net

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<conio.h>

typedef struct _node
{
    char* data;
    struct _node* next;
    struct _node* back;
}node;
node *head, *tail;
int total, now;  // 전체페이지, 현재페이지 출력 변수

void init_line(void);
void load_file(void);
void show_header(void);
void show_page(node*);
void key_proc(void);
void move_line(int, node**);
void gotoxy(int, int);

void main()
{
    init_line();
    load_file();
    key_proc();
    puts("Program ends...");
}

//노드 초기화 함수
void init_line(void)
{
    head = (node*)malloc(sizeof(node));
    tail = (node*)malloc(sizeof(node));
    head->next = tail;
    head->back = head;
    tail->back = head;
    tail->next = tail;
}

//파일 로드 함수
void load_file(void)
{
    FILE *fp;
    char buf[256];
    node* temp;
    if((fp = fopen("test.txt","rt"))==NULL)
    {
        puts("Error : Can`t read that file.");
        exit(1);
    }
    while(!feof(fp))
    {
        fgets(buf, 255, fp);
        if(strlen(buf)>80)
            buf[80] = 0;  // 최대길이 80
        if((temp = (node*)malloc(sizeof(node))) == NULL)
        {
            puts("Error : Out of Memory.");
            exit(1);
        }
        if((temp->data = (char*)malloc(strlen(buf))) == NULL)
        {
            puts("Error : Out of Memory.");
            exit(1);
        }
        strcpy(temp->data, buf);
        temp->next = tail;
        temp->back = tail->back;
        tail->back->next = temp;
        tail->back = temp;
        total++;  //전체 갯수 증가
    }
    fclose(fp);
}  

//화면 출력 함수
void show_page(node* temp)
{
    int line = 0;
    system("cls");
    show_header();
    gotoxy(1, 2);
    while(line++ < 23 && temp != tail)
    {
        cprintf("%-80s\r", temp->data);
        temp = temp->next;
    }
}

//키 제어 함수
void key_proc(void)
{
    node* temp;
    now = 1;
    temp = head->next;
    show_page(temp);
    while(1)
    {
        //ESC키 눌렀을때
        if(GetAsyncKeyState(VK_ESCAPE) & 0x8000)
            break;
        //PgUp키 눌렀을때
        if(GetAsyncKeyState(VK_PRIOR) & 0x8000)
        {
            move_line(-23, &temp);
            show_page(temp);
        }
        //PgDn키 눌렀을때
        if(GetAsyncKeyState(VK_NEXT) & 0x8000)
        {
            move_line(23, &temp);
            show_page(temp);
        }
        //▲키 눌렀을때
        if(GetAsyncKeyState(VK_UP) & 0x8000)
        {
            move_line(-1, &temp);
            show_page(temp);
        }
        //▼키 눌렀을때
        if(GetAsyncKeyState(VK_DOWN) & 0x8000)
        {
            move_line(1, &temp);
            show_page(temp);
        }
    }
    system("cls");
}

//페이지 이동 함수
void move_line(int d, node** temp)
{
    if(d<0)
    {
        while(d++ < 0 && (*temp)->back != head)
        {
            *temp = (*temp)->back;
            now--;
        }
    }
    else
    {
        while(d-- > 0 && (*temp)->next != tail)
        {
            *temp = (*temp)->next;
            now++;
        }
    }
}

//출력화면의 최상단 화면
void show_header(void)
{
    HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hout, &csbi);

    //출력색 변환
    SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    gotoxy(1, 1);
    cprintf("TVIEW : %-12s     Loc : %6d of %6d     By Jeong Jin Hwa     ", "test.txt", now, total);
    //원래색으로 변환
    SetConsoleTextAttribute(hout, csbi.wAttributes);
}

//gotoxy함수
void gotoxy(int x, int y)
{
   COORD Pos = {x - 1, y - 1};
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}

//Double Linked List
#include<stdio.h>
#include<stdlib.h>

 typedef struct _node
{
     int data;
     struct _node* back;
     struct _node* next;
}node;
node *head, *tail;

 void print_all(void);
void init_link(void);
void insert_link(int x);
node* find_node(int x);
void insert_before(int x, node* y);
void del_node(node* x);
void all_del_node(void);

 void main()
{
    init_link();
    insert_link(10);
    insert_link(5);
    insert_link(8);
    insert_link(3);
    insert_link(1);
    insert_link(7);
    insert_link(8);

    printf("Inital Linked list is ");
    print_all();

     printf("Finding 4 is %s\n", find_node(4) != tail ? "successful" : "unsuccessful");
    printf("Finding 5 is %s\n", find_node(5) != tail  ? "successful" : "unsuccessful");

     puts("Inserting 7 before 5");
    insert_before(7, find_node(5));
    print_all();

     puts("Deleting 3");
    del_node(find_node(3));
    print_all();

     puts("Inserting node 2 before 10");
    insert_before(2, find_node(10));
    print_all();

     puts("Deleting 2");
    del_node(find_node(2));
    print_all();

     puts("Deleting 1");
    del_node(find_node(1));
    print_all();

     puts("Insering node 15");
    insert_before(15, head->next);
    print_all();

     puts("Deleting all node");
    all_del_node();
    print_all();
}

 //전체 노드 삭제

void all_del_node(void)
{
    node* temp;
    temp = head->next;
    while(temp != tail)
    {
        temp = temp->next;
        free(temp->back);
    }

    //노드 초기화
    head->next = tail;
    tail->back = head;
}

 

//노드를 입력받아 삭제

void del_node(node* x)
{
    if(x != tail)
    {
        x->back->next = x->next;
        x->next->back = x->back;
        free(x);
    }
    else
        puts("!!!!!!!!!!!!!!!!! Not Node !!!!!!!!!!!!!!!!!");
}

 

//찾은 노드 이전에 삽입

void insert_before(int x, node* y)
{
    node* temp = (node*)malloc(sizeof(node));

    temp->data = x;
    y->back->next = temp;
    temp->back = y->back;
    y->back = temp;
    temp->next = y;
}

 

//노드 찾기
node* find_node(int x)
{
    node* temp;
    temp = head->next;
    while(temp->data != x && temp != tail)
        temp = temp->next;
    return temp;
}

 

//노드값 화면에 출력

void print_all(void)
{
    node* temp;
    temp = head->next;
    while(temp != tail)
    {
        printf("%5d",temp->data);
        temp = temp->next;
    }
    printf("\n");
}

 

//노드 초기화

void init_link(void)
{
    head = (node*)malloc(sizeof(node));
    tail = (node*)malloc(sizeof(node));
    head->next = tail;
    head->back = head;
    tail->next = tail;
    tail->back = head;
}

 

//노드 입력 받기
void insert_link(int x)
{
    node *a;
    node* temp = (node*)malloc(sizeof(node));
   
    a = head->next;
    while(a->data <= x && a != tail)
     a = a->next;

    temp->data = x;
    a->back->next = temp;
    temp->back = a->back;
    temp->next = a;
    a->back = temp;
}


+ Recent posts