1. 목적
- 정렬에 대한 찾아 보기 표(Lookup table)을 이해한다.
- 반복문에서 탈출하는 기법을 익힌다.
2. 문제 (점수 : 30 점) - 문제를 수정했습니다.
- 두 문자열을 입력 받아 공통적으로 포함되는 문자와 첫번째 문자열을 정렬한 문자들을 출력하라
- 출력 순서는 AaBbCcDd ... 순으로 대문자가 우선으로 오고 다음 소문자이며 알파벳 순으로 한다.
- 부호나 띄어쓰기 같은 비알파벳 문자는 생략한다.
- 출력 화면
첫번째 문자열을 입력하세요 : Visual C++ Objective Oriented Programming
두번째 문자열을 입력하세요 : Hello I Love You I need You I Miss You
두 문자열에 공통적으로 포함된 문자 : abCcdegHIijLlMmnOoPrstuVvY
첫번째 문자열을 정렬한 문자 : abCcdegijlmnOoPrstuVv
Press any key to continue
3. 이해
- 검색이나 계산을 편하게 하기 위한 표 작성을 이해하는가?
- 문자열에 대한 정확한 이해를 하였는가?
4. 코드
#include <stdio.h>
#include <string.h>
int main()
{
char in_a[255] = {0};
char in_b[255] = {0};
char temp[255] = {0};
char out[255] = {0};
char ref[] = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
int i, j;
i = j = 0;
printf("첫번째 문자열을 입력하세요 : ");gets(in_a);
printf("두번째 문자열을 입력하세요 : ");gets(in_b);
putchar('\n');
strcat(temp,in_a);
strcat(temp,in_b);
while(temp[i] != 0)
{
if(temp[i] != ' ')
{
out[j] = temp[i];
j++;
}
i++;
}
i = j = 0;
printf("두 문자열에 공통적으로 포함된 문자 : ");
while(ref[j] != 0)
{
while(out[i] != 0)
{
if(out[i] == ref[j])
{
putchar(out[i]);
break;
}
i++;
}
i = 0;
j++;
}
i = j = 0;
putchar('\n');
printf("첫번째 문자열을 정렬한 문자 : ");
while(ref[j] != 0)
{
while(out[i] != 0)
{
if(in_a[i] == ref[j])
{
putchar(in_a[i]);
break;
}
i++;
}
i = 0;
j++;
}
putchar('\n');
return 0;
}
5. 해설
- 표본 표인 AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz 는 이상적인 검색 결과 표이며 이에 대응하여 검색 결과를 계산하지 않고 빠르게 찾을수 있습니다.
- 두 문자열에 공통적으로 포함 된걸 찾기 위해 strcat 함수로 두 문자열을 합친후 띄워쓰기 문자를 없애버리고 A 부터 한글자씩 대응하며 검색합니다. 즉 글자를 계산으로 하지 않고 찾기를 수행함으로써 복잡한 알고리듬을 간소화 했습니다.
- 첫번째 문자열을 정렬한 문자는 문제에서 제시하는 결과를 나타내기 위해 만들었으며 in_a 만 검색하여 출력했습니다.
- 검색된 글자가 2번 이상 나오지 않게 하기 위해 break; 문으로 탈출 합니다.
- char ref[] 에서 [] 한 것은 위의 경우 처럼 바로 정의시에 자동으로 크기를 만들어 주라는 의미 입니다. 자동으로 최적화된 ref[53] : ref[0] = 'A' ~ ref[52] = 'z' / ref[53] = 0 가 생깁니다.
6. 참고
- http://www.winapi.co.kr/clec/cpp1/9-3-4.htm - Lookup table