아나그램 판별방법에 대해서 궁금합니다.

  • JJackS
    JJackS

    ANAGRAM

    검색을 해보았는데,
    '문자열의 순서를 재배치해서 새로운 문자열을 만드는 것'
    이라고 이해를 하였습니다.

    그래서 굳이 문자열을 정렬하지 않고
    문자열 내의 알파벳 개수를 세어 비교 하였습니다.
    (각 알파벳의 개수가 같아야 같은 문자열이다.)

    질문은 이 방법으로 풀이를 할 때, 예외 케이스가 있을까? 하는 것입니다.
    예시 케이스는 잘되는데 제출하면 오류가 나오네요.

    #include<stdio.h>
    #include<string.h>
    //#include<stdlib.h>
    
    int main(){
        char str1[101]={0,}, str2[101]={0,};
        int case_num;
        int alpha1[26]={0,}, alpha2[26]={0,};
        int i=0;
        int j, check;
        int str1_length;
        int str2_length;
        char temp;
        //FILE *fp;
    
        //fp = fopen("input.txt", "r");
        //fscanf(fp, "%d", &case_num);
        scanf("%d", &case_num);
        while(i < case_num){
            //fscanf(fp, "%s", str1);
            //fscanf(fp, "%s", str2);
            scanf("%s", str1);
            scanf("%s", str2);
    
            str1_length = strlen(str1);
            str2_length = strlen(str2);
    
            if(str1_length != str2_length){
                printf("No.\n", str1, str2);
                i++;
                continue;
            }
            else if(strcmp(str1,str2) == 0){
                printf("No.\n");
                i++;
                continue;
            }
    
            for(j=0;j<str1_length; j++){
                switch(str1[j]){
                case 'a' : alpha1[0]++;break;
                case 'b' : alpha1[1]++;break;
                case 'c' : alpha1[2]++;break;
                case 'd' : alpha1[3]++;break;
                case 'e' : alpha1[4]++;break;
                case 'f' : alpha1[5]++;break;
                case 'g' : alpha1[6]++;break;
                case 'h' : alpha1[7]++;break;
                case 'i' : alpha1[8]++;break;
                case 'j' : alpha1[9]++;break;
                case 'k' : alpha1[10]++;break;
                case 'l' : alpha1[11]++;break;
                case 'm' : alpha1[12]++;break;
                case 'n' : alpha1[13]++;break;
                case 'o' : alpha1[14]++;break;
                case 'p' : alpha1[15]++;break;
                case 'q' : alpha1[16]++;break;
                case 'r' : alpha1[17]++;break;
                case 's' : alpha1[18]++;break;
                case 't' : alpha1[19]++;break;
                case 'u' : alpha1[20]++;break;
                case 'v' : alpha1[21]++;break;
                case 'w' : alpha1[22]++;break;
                case 'x' : alpha1[23]++;break;
                case 'y' : alpha1[24]++;break;
                case 'z' : alpha1[25]++;break;
    
                case 'A' : alpha1[0]++;break;
                case 'B' : alpha1[1]++;break;
                case 'C' : alpha1[2]++;break;
                case 'D' : alpha1[3]++;break;
                case 'E' : alpha1[4]++;break;
                case 'F' : alpha1[5]++;break;
                case 'G' : alpha1[6]++;break;
                case 'H' : alpha1[7]++;break;
                case 'I' : alpha1[8]++;break;
                case 'J' : alpha1[9]++;break;
                case 'K' : alpha1[10]++;break;
                case 'L' : alpha1[11]++;break;
                case 'M' : alpha1[12]++;break;
                case 'N' : alpha1[13]++;break;
                case 'O' : alpha1[14]++;break;
                case 'P' : alpha1[15]++;break;
                case 'Q' : alpha1[16]++;break;
                case 'R' : alpha1[17]++;break;
                case 'S' : alpha1[18]++;break;
                case 'T' : alpha1[19]++;break;
                case 'U' : alpha1[20]++;break;
                case 'V' : alpha1[21]++;break;
                case 'W' : alpha1[22]++;break;
                case 'X' : alpha1[23]++;break;
                case 'Y' : alpha1[24]++;break;
                case 'Z' : alpha1[25]++;break;
                }
            }
    
            for(j=0;j<str2_length; j++){
                switch(str2[j]){
                case 'a' : alpha2[0]++;break;
                case 'b' : alpha2[1]++;break;
                case 'c' : alpha2[2]++;break;
                case 'd' : alpha2[3]++;break;
                case 'e' : alpha2[4]++;break;
                case 'f' : alpha2[5]++;break;
                case 'g' : alpha2[6]++;break;
                case 'h' : alpha2[7]++;break;
                case 'i' : alpha2[8]++;break;
                case 'j' : alpha2[9]++;break;
                case 'k' : alpha2[10]++;break;
                case 'l' : alpha2[11]++;break;
                case 'm' : alpha2[12]++;break;
                case 'n' : alpha2[13]++;break;
                case 'o' : alpha2[14]++;break;
                case 'p' : alpha2[15]++;break;
                case 'q' : alpha2[16]++;break;
                case 'r' : alpha2[17]++;break;
                case 's' : alpha2[18]++;break;
                case 't' : alpha2[19]++;break;
                case 'u' : alpha2[20]++;break;
                case 'v' : alpha2[21]++;break;
                case 'w' : alpha2[22]++;break;
                case 'x' : alpha2[23]++;break;
                case 'y' : alpha2[24]++;break;
                case 'z' : alpha2[25]++;break;
    
                case 'A' : alpha2[0]++;break;
                case 'B' : alpha2[1]++;break;
                case 'C' : alpha2[2]++;break;
                case 'D' : alpha2[3]++;break;
                case 'E' : alpha2[4]++;break;
                case 'F' : alpha2[5]++;break;
                case 'G' : alpha2[6]++;break;
                case 'H' : alpha2[7]++;break;
                case 'I' : alpha2[8]++;break;
                case 'J' : alpha2[9]++;break;
                case 'K' : alpha2[10]++;break;
                case 'L' : alpha2[11]++;break;
                case 'M' : alpha2[12]++;break;
                case 'N' : alpha2[13]++;break;
                case 'O' : alpha2[14]++;break;
                case 'P' : alpha2[15]++;break;
                case 'Q' : alpha2[16]++;break;
                case 'R' : alpha2[17]++;break;
                case 'S' : alpha2[18]++;break;
                case 'T' : alpha2[19]++;break;
                case 'U' : alpha2[20]++;break;
                case 'V' : alpha2[21]++;break;
                case 'W' : alpha2[22]++;break;
                case 'X' : alpha2[23]++;break;
                case 'Y' : alpha2[24]++;break;
                case 'Z' : alpha2[25]++;break;
                }
            }           
            //printf("\tA\tB\tC\tD\tE\tF\tG\tH\tI\tJ\tK\tL\tM\tN\tO\tP\tQ\tR\tS\tT\tU\tV\tW\tX\tY\tZ\n");
            for(j=0; j<26; j++){
                //if(alpha1[j] == alpha2[j]) temp = 'o';
                //else temp = 'x';
                //printf("%2d%2d%c\t", alpha1[j], alpha2[j], temp);
                if(alpha1[j] != alpha2[j]){
                    check=11;
                }
            }
            //printf("\n");
            if(check == 11){ 
                printf("No.\n");
            }
            else printf("Yes\n");
            memset(str1, 0, sizeof(str1));
            memset(str2, 0, sizeof(str2));
            memset(alpha1, 0, sizeof(alpha1));
            memset(alpha2, 0, sizeof(alpha2));
            i++;
            check =0;
        }
        //system("pause");
        return 0;
    }
    

    10년 전
2개의 댓글이 있습니다.
  • Being
    Being

    문제를 잘 읽어보시면, 입력은 alphanumeric하며 case-sensitive 하다고 되어 있습니다. 다시 말하면, 알파벳과 숫자가 들어올 수 있으며 대소문자를 구별한다는 뜻입니다.

    따라서 위와 같이 코드를 늘어놓게 되면 이런 변경사항이 생겼을 때 곤란하게 됩니다. 코드를 줄일 수 있는 방법이 분명 있겠죠? :)


    10년 전 link
  • JJackS
    JJackS

    Being 감사합니다. 제가 해석을 제대로 못했군요.ㅠㅠ
    알파벳만 있다고 생각을 해서 단순하게 코딩했는데, 다시 짜봐야겠네요^^


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.