안녕하세요. 언제나 휴일입니다.
이번에는 두 개의 문자열이 애너그램(anagram) 인지 판별하는 소스 코드입니다.
애너그램이란 서로 다른 문자열을 구성하는 문자의 집합이 같은 것을 말합니다. 따라서 하나의 문자열의 문자를 재배치하였을 때 다른 문자열과 같게 만들 수 있다면 애너그램이라고 말합니다.
알고리즘은 다음과 같습니다.
IsAnagram(s1, s2)
…if(length(s1) is not equal length(s2))
……return false
…copy(buf,s1)
…Loop1(i:0->s2[i]’s character is true character)
……check:=false
……Loop2(j:0->buf[j]’s character is true character)
………if(s2[i] is equal buf[j])
…………remove buf[j]
…………check:=true
…………break Loop1
……if(check is false)
………return false
…return true
/*언제나 C언어 예제 Center 애너그램(anagram) 판별하기 */ #include #include void TestIssAnagram(const char* s1, const char* s2); int main() { TestIssAnagram("silent", "listen"); TestIssAnagram("garden", "ranged"); TestIssAnagram("split", "lisp"); TestIssAnagram("ssss", "lisp"); } int IsAnagram(const char* s1, const char* s2); void TestIssAnagram(const char* s1, const char* s2) { printf("=== Test %s %s ===\n", s1, s2); if (IsAnagram(s1, s2)) { printf("Result: Anagram\n"); } else { printf("Result: Is Not Anagram\n"); } } int IsAnagram(const char* s1, const char* s2) { int i, j; int check; if (strlen(s1) != strlen(s2)) { return 0; } char buf[256] = ""; strcpy_s(buf, sizeof(buf), s1); for (i = 0; s2[i]; i++)//s2[i] 문자가 참이면(거짓은 종료 문자임) 반복 { check=0;//check를 거짓으로 초기화(발견하지 못함) for (j = 0; buf[j]; j++)//buf[j] 문자가 참이면(거짓은 종료 문자임) 반복 { if (s2[i] == buf[j])//s2[i]와 buf[j]가 같으면 { strcpy_s(buf + j, sizeof(buf) - j, buf + j + 1);//buf[j] 뒤에 있는 것을 한 칸 앞으로 이동, buf[j] 문자 추출 check=1;//check를 참으로 마킹(발견하였음) break;//반복문 탈출(s2[j]은 참인 상태임) } } if(check==0)//check가 거짓이면(발견하지 못하였음) { return 0; } } return 1;//anagram임 }
실행 결과
=== Test silent listen === Result: Anagram === Test garden ranged === Result: Anagram === Test split lisp === Result: Is Not Anagram