안녕하세요? 스머팩트입니다.
제시하신 소스코드 살펴봤습니다.
[파일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 <
: