아나그램 판별방법에 대해서 궁금합니다. 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; } 11년 전
2개의 댓글이 있습니다. Being 문제를 잘 읽어보시면, 입력은 alphanumeric하며 case-sensitive 하다고 되어 있습니다. 다시 말하면, 알파벳과 숫자가 들어올 수 있으며 대소문자를 구별한다는 뜻입니다. 따라서 위와 같이 코드를 늘어놓게 되면 이런 변경사항이 생겼을 때 곤란하게 됩니다. 코드를 줄일 수 있는 방법이 분명 있겠죠? :) 11년 전 link JJackS Being 감사합니다. 제가 해석을 제대로 못했군요.ㅠㅠ 알파벳만 있다고 생각을 해서 단순하게 코딩했는데, 다시 짜봐야겠네요^^ 11년 전 link 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
JJackS
ANAGRAM
검색을 해보았는데,
'문자열의 순서를 재배치해서 새로운 문자열을 만드는 것'
이라고 이해를 하였습니다.
그래서 굳이 문자열을 정렬하지 않고
문자열 내의 알파벳 개수를 세어 비교 하였습니다.
(각 알파벳의 개수가 같아야 같은 문자열이다.)
질문은 이 방법으로 풀이를 할 때, 예외 케이스가 있을까? 하는 것입니다.
예시 케이스는 잘되는데 제출하면 오류가 나오네요.
11년 전