본문 바로가기

TEST/자료구조와 함께 배우는 알고리즘 입문(C언어)

<8> Q9. 자료구조와 함께 배우는 알고리즘 입문 (C언어)

#include <stdio.h>

int bf_match(const char txt[], const char pat[])
{
    int pt = 0;
    int pp = 0;
    int count = 0;

    while (txt[pt] != '\0' && pat[pp] != '\0')
    {
        //print
        if (pp == 0)
        {
            printf("%d ", pt);
            for (int i = 0; txt[i] != '\0'; i++)
                printf("%c", txt[i]);
        }
        else
        {
            printf("  ");
            for (int i = 0; txt[i] != '\0'; i++)
                printf("%c", txt[i]);
        }
        printf("\n");
        //print

        if (txt[pt] == pat[pp])
        {
            //print
            for (int i = 0; i < pt + 2; i++)
                printf(" ");
            printf("+");
            printf("\n");
            for (int i = 0; i < pt + 2; i++)
                printf(" ");
            printf("\n");
            for (int i = 0; i < pt - pp + 2; i++)
                printf(" ");
            for (int i = 0; pat[i] != '\0'; i++)
                printf("%c", pat[i]);
            printf("\n\n");
            //print

            pt++;
            pp++;
            count++;
        }
        else
        {
            //print
            for (int i = 0; i < pt + 2; i++)
                printf(" ");
            printf("|");
            printf("\n");
            for (int i = 0; i < pt + 2; i++)
                printf(" ");
            printf("\n");
            for (int i = 0; i < pt - pp + 2; i++)
                printf(" ");
            for (int i = 0; pat[i] != '\0'; i++)
                printf("%c", pat[i]);
            printf("\n\n");
            //print

            pt = pt - pp + 1;
            pp = 0;
            count++;
        }
    }
    printf("비교를 %d회 시도합니다.\n", count);
    if (pat[pp] == '\0')
        return pt - pp;
    return -1;
}

int main(void)
{
    int idx;
    char s1[256];
    char s2[256];
    puts("브루트-포스법");
    printf("텍스트 : ");
    scanf("%s", s1);
    printf("패턴 : ");
    scanf("%s", s2);
    idx = bf_match(s1, s2);
    if (idx == -1)
        puts("텍스트에 패턴이 없습니다.");
    else
        printf("%d번째 문자부터 match합니다.\n", idx + 1);

    return 0;
}