[C언어 소스] 애너그램(anagram) 문자열 판별하기

안녕하세요. 언제나 휴일입니다.

이번에는 두 개의 문자열이 애너그램(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