수다닷컴

  • 해외여행
    • 괌
    • 태국
    • 유럽
    • 일본
    • 필리핀
    • 미국
    • 중국
    • 기타여행
    • 싱가폴
  • 건강
    • 다이어트
    • 당뇨
    • 헬스
    • 건강음식
    • 건강기타
  • 컴퓨터
    • 프로그램 개발일반
    • C언어
    • 비주얼베이직
  • 결혼생활
    • 출산/육아
    • 결혼준비
    • 엄마이야기방
  • 일상생활
    • 면접
    • 취업
    • 진로선택
  • 교육
    • 교육일반
    • 아이교육
    • 토익
    • 해외연수
    • 영어
  • 취미생활
    • 음악
    • 자전거
    • 수영
    • 바이크
    • 축구
  • 기타
    • 강아지
    • 제주도여행
    • 국내여행
    • 기타일상
    • 애플
    • 휴대폰관련
  • 프로그램 개발일반
  • C언어
  • 비주얼베이직

편집거리 프로그램 좀 도와주세요

연블루

2023.04.01


질문 제목 : 제가 짜본 건데 결과 부분에 편집거리가 나오게 배열을 출력 해야하는데
왠지 편집거리가 너무 크게 나와서 제대로 편집거리가 나올수 있게 만들고 싶은데 어떻게 해야하나요?
수정할 부분이나 틀린부분을 간단하게 설명을 같이 해주시면 감사하겠습니다.질문 내용 :#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중 최소값 출력
}

신청하기





COMMENT

댓글을 입력해주세요. 비속어와 욕설은 삼가해주세요.

번호 제 목 글쓴이 날짜
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
<<  이전  1 2 3 4 5 6 7 8 9 10  다음  >>

수다닷컴 | 여러분과 함께하는 수다토크 커뮤니티 수다닷컴에 오신것을 환영합니다.
사업자등록번호 : 117-07-92748 상호 : 진달래여행사 대표자 : 명현재 서울시 강서구 방화동 890번지 푸르지오 107동 306호
copyright 2011 게시글 삭제 및 기타 문의 : clairacademy@naver.com