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

Posted by 카켈