#include #include #include #include /* µ¿Àû ÇÁ·Î±×·¡¹ÖÀ¸·Î µÎ ¹®ÀÚ¿­ÀÇ ÆíÁý °Å¸®¸¦ ¾Ë¾Æº¸´Â ÇÁ·Î±×·¥ <ȯ°æ ¼³Á¤> 1. ¸ÕÀú ÀÔ·ÂµÈ ¹®ÀÚ¿­¿¡ ´ëÇÑ ±æÀ̸¦ ȹµæÇÏ°í 2. ±æÀÌ¿¡ ¸ÂÃç¼­ ÀÌÂ÷¿ø ¹è¿­À» ¼±¾ðÇÑ´Ù. À̶§ ¹®ÀÚ¿­ÀÌ ¾ø´Â °æ¿ìµµ Æ÷ÇÔÇؼ­ "±æÀÌ + 1" ¸¸Å­ÀÇ Å©±â·Î ¼±¾ðÇÑ´Ù. <ºÎ¿¬¼³¸í> Çà·ÂÀÇ ÇàÀÌ ÀǹÌÇϴ°ÍÀº ¿øº» ¹®ÀÚ¿­ÀÌ°í ¿­ÀÌ ÀǹÌÇϴ°ÍÀº ¸ñÀû ¹®ÀÚ¿­ÀÌ´Ù. ±×·¯´Ï ÇàÀÇ °ªÀÌ ¿À¸£´Â°ÍÀº ¹®ÀÚ¿­ÀÇ »èÁ¦¿¡ ´ëÇÑ cost°¡ Áõ°¡Çϴ°ÍÀ» ÀǹÌÇÏ°í ¿­ÀÌ ¿À¸£´Â°ÍÀº ¹®ÀÚ¿­ÀÇ Ãß°¡¿¡ ´ëÇÑ ÄÚ½ºÆ®°¡ Áõ°¡ÇÔÀ» ÀǹÌÇÑ´Ù. ±×¸®°í °»½ÅÀÇ cost´Â ½ÇÁ¦·ÎÀÇ »óȲ¿¡¼­´Â Ãß°¡, »èÁ¦°¡ ÇѲ¨¹ø¿¡ ÀϾ´Â °ÍÀÌÁö¸¸ 1·Î º»´Ù. ±×·¡¼­ ¹®ÀÚ¿­ÀÇ Ãß°¡, »èÁ¦, °»½ÅÀº cost°¡ ¸ðµÎ 1ÀÌ´Ù. <¼öÇà in geteditdistance> 1. °¢ Çà¿¡ ´ëÇÑ ¼öÇà matrix[i][j] = Getmin(matrix[i-1][j] + 1, matrix[i][j-1] + 1, matrix[i-1][j-1] + isreplace); isreplace´Â ÇöÀç °Ë»çÇÏ´Â ¹®ÀÚ°¡ °°À» °æ¿ì¿¡´Â 0ÀÌ°í ´Ù¸¦ °æ¿ì¿¡´Â °»½Å ÄÚ½ºÆ® 1À» Ãß°¡ÇÑ´Ù. óÀ½ ºÎÅÍ ÀÎÀÚ°¡ ÀǹÌÇϴ°ÍÀº »èÁ¦, »ðÀÔ, °»½Å¿¡ ´ëÇÑ ÄÚ½ºÆ®ÀÌ´Ù. ±×·¯´Ï±î ÇöÀç »óÅ¿¡ ¿À±â Á÷Àü±îÁöÀÇ ¸ðµç ÃÖÀûÀÇ »ðÀÔ, »èÁ¦, °»½ÅÁß¿¡¼­ °¡Àå ÀÛÀº °ªÀ» ÇöÀçÀÇ °¡Àå ÃÖÀûÇØ·Î ÁöÁ¤Çϴ°ÍÀÌ´Ù. http://www.freesearch.pe.kr °í°¨ÀÚ */ #define MAX_LENGTH 999 int Geteditdistance(int **matrix, char *strFirst, char *strSecond, int flen, int slen); int Getmin(int ,int, int); int main(void){ char strFirst[999]; char strSecond[999]; int firstlen; int secondlen; int **matrix; int i, j; int retval; printf("Input First String : "); scanf( "%s",strFirst); printf("Input Second String : "); scanf("%s",strSecond); /* ÀÔ·ÂÇÑ ¹®ÀÚ¿­¿¡ »óÀÀÇÏ´Â ¸ÞÆ®¸¯½º Á¦ÀÛ */ firstlen = strlen(strFirst); secondlen = strlen(strSecond); matrix = (int**)malloc(sizeof(int*) * (firstlen + 1)); for(i = 0; i <= firstlen; i++){ *(matrix + i) = (int*)malloc(sizeof(int) * (secondlen + 1)); } retval = Geteditdistance(matrix, strFirst, strSecond, firstlen + 1, secondlen + 1); printf("Edit Distance between \"%s\" and \"%s\" = %d\n\n", strFirst, strSecond, retval); printf("Detail Trace!\n"); for(i = 0; i <= firstlen;i++){ for(j = 0;j <= secondlen;j++){ printf("%d ", matrix[i][j]); } printf("\n"); } /* ¹è¿­ ¸Þ¸ð¸® ÇØÁ¦ */ for(i = 0; i <= firstlen; i++){ free(matrix[i]); } free(matrix); matrix = NULL; return 0; } int Geteditdistance(int **matrix, char *strFirst, char *strSecond, int flen, int slen){ int i,j; int isreplace; /* 0¿­°ú 0Çà¿¡ ´ëÇÑ ÃʱâÈ­ */ for(i = 0; i < slen; i++){ matrix[0][i] = i; } for(i = 0; i < flen; i++){ matrix[i][0] = i; } for(i = 1; i < flen; i++){ /* óÀ½ ÁÖ¾îÁø ¹®ÀÚ¿­ÀÇ ±æÀ̸¸Å­ ¹Ýº¹ */ for(j = 1; j < slen; j++){/* ´ë»óÀÌ µÇ´Â ¹®ÀÚ¿­ÀÇ ±æÀ̸¸Å­ ¹Ýº¹ */ if( strFirst[i -1] == strSecond[j -1]) isreplace = 0; else isreplace = 1; matrix[i][j] = Getmin(matrix[i-1][j] + 1, matrix[i][j-1] + 1, matrix[i-1][j-1] + isreplace); } } return matrix[flen-1][slen-1]; } int Getmin(int a,int b, int c){ int min = INT_MAX; if(a < min) min = a; if(b < min) min = b; if(c < min) min = c; return min; }