편집거리 프로그램 좀 도와주세요
연블루
질문 제목 : 제가 짜본 건데 결과 부분에 편집거리가 나오게 배열을 출력 해야하는데
왠지 편집거리가 너무 크게 나와서 제대로 편집거리가 나올수 있게 만들고 싶은데 어떻게 해야하나요?
수정할 부분이나 틀린부분을 간단하게 설명을 같이 해주시면 감사하겠습니다.질문 내용 :#includestdio.h
#includestdlib.h //random함수 사용을 위한 헤더파일
#includestring.h //문자열 사용을 위한 헤더파일
#include time.h //time함수의 사용을 위한 헤더파일
#define max 100
#define edit_cost (1) //삽입,삭제연산을 위해 만든 매크로 함수
inline int min(int a, int b);
int minimum(int a, int b, int c);
/*메인함수 */
/*upcell, leftcell, cornercell은 각각 삽입 삭제, 대체연산을 위해 만든 변수다.
변수 m,n은 malloc 동적할당을 할때 배열의 크기를 입력하기 위해 만들었다.
변수 cost는 두 문자열의 최소 편집거리를 저장시키기 위해 만들었다.
변수 ins, del, subs는 각각 삽입, 삭제, 대체연산이 몇번 이루어졌는가 확인시키기 위해 선언한 변수다.
str1[],str2[]는 문자열을 저장하게 위해 매크로문으로 사이즈100을 할당하여 변수로 만들었다.
*/
int main()
{
int upcell, leftcell, cornercell; //
int m,n,value1,value2;
int cost = 0;
int ins=0, del=0, subs=0;
char str1[max]={0};
char str2[max]={0};srand((unsigned int)time(null)); //랜덤함수를 지정하고
value1=rand()%20+1; //변수 value1와value2에 1에서 20까지의 숫자를
value2=rand()%20+1; //랜덤으로 생성해 저장하게 만들었다.
printf(str1 : %d\n,value1); //저장이 되었는지 출력시킨다.
printf(str2 : %d\n,value2);
for(int a=0;avalue1;a++)
{
str1[a]=rand()%26+65; //rand함수를 사용하여
//0~25까지 26개 숫자 +65 (알파벳 26개 + (65 == a))을 이용하여 문자열을 출력시킬수 있게 만들었다.
}
for(int b=0;bvalue2;b++)
{
str2[b]=rand()%26+65;
{
if(str1 == str2)
b--; // str1과 str2문자 같을경우 연산할 필요가 없기 때문데 b하나를 제거한다.
}
}
m=strlen(str1)+1;
n=strlen(str2)+1;
int *t = (int *)malloc( (m) * (n) * sizeof(int));
//포인터변수 = (포인터변수 데이터형*) malloc(포인터변수 데이터크기*필요한 크기)
//동적 메모리할당 (공간낭비 최소화), t[m][n]
for(int i = 0; i m; i++)
for(int j = 0; j n; j++)
*(t + i * n + j) = 0; //배열 초기화
for(int i = 0; i m; i++)
*(t + i * n) = i; // t[i][0] = i
for(int j = 0; j n; j++)
*(t + j) = j; // t[0][j] = j for(int i = 1; i m; i++)
{
for(int j = 1; j n; j++)
{
upcell = *(t + (i-1)*n + j); //t[i-1][j]
upcell += edit_cost; // t[i-1][j]에서 1을 더하게 되면, 삽입이 된다.
leftcell = *(t + i*n + j-1); //t[i][j-1]
leftcell += edit_cost; // t[i][j-1]에서 1을 더하게 되면, 삭제가 된다.
 sp; cornercell = *(t + (i-1)*n + (j-1) ); // t[i-1][j-1]
cornercell += (str1[i-1] != str2[j-1]); // 대체 str1[i-1]과 str2[j-1]이 다르면 조건을 만족하여 1(true)을 반환한다.
// 조건을 만족하지 않는다면 0을 반환한다.
*(t + (i)*n + (j)) = minimum(leftcell, upcell, cornercell);
// t[i][j] = 최소값(leftcell,topcell,conercell 중 가장 작은 수를 저장한다.)}
}
cost = *(t + m*n-1 ); // t[m][n]값 cost에 대입한다.
if(mn)
ins = n-m; //삽입연산회수
if(nm)
del = m-n; //삭제연산회수
subs = min(cost-ins, cost-del); //대체연산회수
printf(첫번째 단어는 %s이고, 두번째 단어는 %s입니다. \n,
str1, str2);
printf(첫번째 문자열 %s와 두번째 문자열 %s의 최소편집거리 %d\n,
str1, str2, cost);
printf(삽입 %d번, 삭제 %d번, 대체 %d번 발생합니다.\n,
ins,del,subs);
printf(결과\n);
for(int i = 1; i m; i++)
{
for(int j = 1; j n; j++)
{
upcell = *(t + (i-1)*n + j); //t[i-1][j]
upcell += edit_cost; // t[i-1][j]에서 1을 더하게 되면, 삽입이 된다.
leftcell = *(t + i*n + j-1); //t[i][j-1]
leftcell += edit_cost; // t[i][j-1]에서 1을 더하게 되면, 삭제가 된다.
cornercell = *(t + (i-1)*n + (j-1) ); // t[i-1][j-1]
cornercell += (str1[i-1] != str2[j-1]); // 대체 str1[i-1]과 str2[j-1]이 다르면 조건을 만족하여 1(true)을 반환한다.
// 조건을 만족하지 않는다면 0을 반환한다.
*(t + (i)*n + (j)) = minimum(leftcell, upcell, cornercell);
// t[i][j] = 최소값(leftcell,topcell,conercell 중 가장 작은 수를 저장한다.)
printf(%2d ,*(t+(i)*n+(j)));
}
printf(\n);
}
return 0;
}
/*min함수와 minimum함수*/
/*이 두 함수는 upcell, leftcell, conercell 중 가장 작은 수를 반환하는 역활을 한다. */
inline int min(int a, int b) //
{
return a b ? a : b; //ab true a출력 false b출력
}
int minimum(int a, int b, int c)
{
return min(min(a, b), c); //a,b,c중 최소값 출력
}
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2700426 | 인터넷 창 띄우는 질문이요 (1) | 정훈 | 2025-07-04 |
2700400 | 원넓이를 계산이요 ㅜㅜ | 천칭자리 | 2025-07-04 |
2700368 | if에 관해서 질문이요... | Orange | 2025-07-04 |
2700339 | 이거 결과값이 왜이런건지.. (4) | 그댸와나 | 2025-07-04 |
2700313 | 파일 읽어서 저장하는데 빈파일일 경우 문재가 발생하네요.. (2) | 크나 | 2025-07-03 |
2700287 | 구조체 동적할당 연습을 하는데 오류가 뜹니다...(해결) (3) | 아련나래 | 2025-07-03 |
2700264 | 문자와 숫자 동시에 입력??? | 글고운 | 2025-07-03 |
2700236 | txt파일로만 쓰고 읽게 하려면 어떻게 해야 하나요..?? (8) | 미국녀 | 2025-07-03 |
2700211 | 전위 연산자 (2) | 어른처럼 | 2025-07-02 |
2700183 | C에서 파일이름을 받고, 그 파일의 사이즈를 출력해줘야하는데 내용이 출력이 안되네요 ;ㅅ; | 피스케스 | 2025-07-02 |
2700150 | 꼭좀 도와주세요ㅠㅠㅠ | 호습다 | 2025-07-02 |
2700095 | 연산문제...질문... | 오빤테앵겨 | 2025-07-01 |
2700070 | while문 , 3의배수 출력하는 프로그램좀 짜주세욤. | 횃불 | 2025-07-01 |
2700041 | 초보인데요 ㅎ 배열안에 배열을 집어넣을수 있나요?? | 헛장사 | 2025-07-01 |
2700012 | 배열// (1) | 전갈자리 | 2025-07-01 |
2699895 | 무한루프에 빠집니다.!! 해결좀부탁드려요 (10) | 선아 | 2025-06-30 |
2699842 | 질문을 너무 많이 하네여.....죄송.... (2) | 해님꽃 | 2025-06-29 |
2699816 | 오류 질문입니다.. (1) | 해비치 | 2025-06-29 |
2699763 | 질문입니다 ! 꼭 좀 도와주세요ㅠㅠ (2) | 미라 | 2025-06-28 |
2699555 | c언어 다항식을 입력을 했는데 왜 출력이 안될까요? | 피스케스 | 2025-06-27 |