Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[6968] Re:[답변]문자열 중복 예제를 풀다가 정말 모르겠어요. 도와주세요
스머팩트 [lego2000] 1840 읽음    2015-10-20 21:57
안녕하세요? 스머팩트입니다.

제시하신 소스코드 살펴봤습니다.

[파일1] 데이터파일
21 18
SAQLANGUAGEOFCOMPUTER
SOFTWAREPROGRAMING


----------
1. 원인
----------

글자가 같은지를 비교하고, 다를 때 까지 반복해서 같은 글자가 2개 이상이면
출력하는 부분이 for (int k = 0; k <= min; k++)문 안에 있습니다.
min은 현시점의 비교 가능한 최대 문자수 이고요.

문제는 [파일1] 데이터파일의
첫문장에 포함된 NG와
두번째 문장 끝에있는 NG를 비교할 때 발생합니다.

두번째 문장 끝부분의 NG다음에 더이상의 문자가 없으므로 for문을 벗어나게 됩니다.(문자열이 끝나버려서)
따라서 NG는 출력이 안되는거죠.

거기에 비교가 끝나면 count, temp는 초기화(count=0, temp=0) 되어야 하는데 count=2, temp=2로 값이 설정되어
다음 단어 찾기에도 영향을 주게됩니다.

[코드1]은 문제를 수정 한 프로그램 입니다.

[코드1] 수정된 코드
int main()
{
	int a, b, count = 0;
	int min;
	int total = 0;
	ifstream fin;
	fin.open("..\\..\\data.txt");
	fin >> a >> b;

	char *arr1 = new char[a];
	char *arr2 = new char[b];

	for (int i = 0; i < a; i++)
	{
		fin >> arr1[i];
	}
	for (int i = 0; i < b; i++)
	{
		fin >> arr2[i];
	}

	for (int i = 0; i < a; i++)
	{
		for (int j = 0; j < b; j++)
		{
			if (arr1[i] == arr2[j])
			{
				min = 0;
				if (a - i - 1 > b - j - 1)
				{
					min = b - j - 1;
				}
				else
				{
					min = a - i - 1;
				}

				for (int k = 0; k <= min; k++)
				{
					if (arr1[i+k] == arr2[j+k])
					{
						count++;
					}
					else break;
				}

				if (count > 1)
				{
					for (int l = 0; l < count; l++)
					{
						cout << arr1[i + l];
					}
					cout << " ";
					total++;
				}
				count = 0;
			}
		}
	}

	cout << total;
}


결과입니다.

SAQLANGUAGEOFCOMPUTER
SOFTWAREPROGRAMING
NG OF 2

----------------
2. 단순화
----------------

코드를 좀 정리해 보았습니다.

[코드2] 단순화된 코드
for (int i = 0; i < a; i++)
{
	for (int j = 0; j < b; j++)
	{
		int aLeft = a - i;
		int bLeft = b - j;
		int minLeft = (aLeft < bLeft) ? aLeft : bLeft;

		int count = 0;
		while(count < minLeft && arr1[i+count] == arr2[j+count]) count++;

		if (count > 1)
		{
			for (int l = 0; l < count; l++) cout << arr1[i + l];
			cout << " ";
			total++;
		}
	}
}







호롱 님이 쓰신 글 :
: -----------------------------------------------------------------
: 먼저 중복문자열이라는 텍스트파일에는 아래와 같은 내용이 들어있구요.
:
: 21 18
: SAQLANGUAGEOFCOMPUTER
: SOFTWAREPROGRAMING
:
:
: 저 위에문자열과 아래문자열을 비교해서 중복이 되는 문자열을 구하고(2자 이상)
: 중복되는 문자열의 개수를 나타내는 예제입니다.
:
: 모범답안은 OF NG 2  라고 나와야 하네요.
: string 헤더파일에 있는 string 함수를 이용하지 않고 코드를 작성해봤는데
: 아무리봐도 답이 안나오는 이유를 모르겠네요. 도와주세요!
:
: string 함수를 사용하는 방법을 알려주셔도 좋습니다!!
: --------------------------------------------------------------------
:
: 
: #include 
: #include 
: #include 
: using namespace std;
: 
: 
: int main()
: {
: 	int a, b, count = 0, temp = 0;
: 	int min;
: 	int total = 0;
: 	ifstream fin;
: 	fin.open("중복문자열.txt");
: 	fin >> a >> b;
: 
: 	char *arr1 = new char[a];
: 	char *arr2 = new char[b];
: 
: 	for (int i = 0; i < a; i++)
: 	{
: 		fin >> arr1[i];
: 	}
: 	for (int i = 0; i < b; i++)
: 	{
: 		fin >> arr2[i];
: 	}
: 
: 	for (int i = 0; i < a; i++)
: 	{
: 		for (int j = 0; j < b; j++)
: 		{
: 			if (arr1[i] == arr2[j])
: 			{
: 				min = 0;
: 				if (a - i - 1 > b - j - 1)
: 				{
: 					min = b - j - 1;
: 				}
: 				else
: 				{
: 					min = a - i - 1;
: 				}
: 
: 				for (int k = 0; k <= min; k++)
: 				{
: 					if (arr1[i+k] == arr2[j+k])
: 					{
: 						count++;
: 						temp++;
: 					}
: 					else
: 					{
: 						temp++;
: 					}
: 
: 					if (temp > count)
: 					{
: 						if (count > 1)
: 						{
: 							for (int l = 0; l < count; l++)
: 							{
: 								cout << arr1[i + l];
: 							}
: 							cout << " ";
: 							total++;
: 							temp = 0, count = 0;
: 							break;
: 						}
: 						else
: 						{
: 							temp = 0, count = 0;
: 							break;
: 						}
: 					}
: 				}
: 			}
: 		}
: 	}
: 	cout << endl;
: 	cout << total <


:

+ -

관련 글 리스트
6964 문자열 중복 예제를 풀다가 정말 모르겠어요. 도와주세요 호롱 1817 2015/10/15
6968     Re:[답변]문자열 중복 예제를 풀다가 정말 모르겠어요. 도와주세요 스머팩트 1840 2015/10/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.