Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

문타쿠, 공부하다.

[C언어 코딩 도장] Unit 47. 회문 판별과 N-gram 만들기 본문

C언어/C언어 코딩 도장

[C언어 코딩 도장] Unit 47. 회문 판별과 N-gram 만들기

개발새발 문타쿠 2023. 10. 3. 02:52

47.1 회문 판별

회문(palindrome)이란?

-> 순서를 거꾸로 읽어도 제대로 읽은 것과 같은 단어나 문장을 말한다.

ex) 우영우, 기러기, 토마토, SOS, rotator, level ...


내가 작성한 회문 판별 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main(void)
{
    char word[20];
    int length;
    int palindrome;

    printf("단어를 입력하세요>> ");
    scanf("%s", word);

    length = strlen(word);
    
    for (int i = 0; i < length; i++)
    {
        if ((i == length - (i + 1)) || (i > length - (i + 1)))
            break;
        else
        {
            if (word[i] == word[length - (i + 1)])
            {
                // O
                palindrome = 1;
                continue;
            }
            else
            {
                // X
                palindrome = 0;
                break;
            }
        }
    }

    if (palindrome)
        printf("이 단어는 회문입니다.(%d)\n", palindrome);
    else
        printf("이 단어는 회문이 아닙니다.(%d)\n", palindrome);

    return 0;
}


책에 나와 있는 회문 판별 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

int main(void)
{
    char word[30];
    int length;
    bool isPalindrome = true;

    printf("단어를 입력하세요: ");
    scanf("%s", word);

    length = strlen(word);

    for (int i = 0; i < length / 2; i++)
    {
        if (word[i] != word[length - 1 - i])
        {
            isPalindrome = false;
            break;
        }
    }

    printf("%d\n", isPalindrome);

    return 0;
}


47.2 N-gram 만들기

N-gram이란?

-> 문자열에서 N개의 연속된 요소를 추출하는 방법

ex) "Hello"라는 문자열을 문자(글자) 2-gram으로 추출하면 다음과 같은 결과가 나온다.

He
el
ll
lo

내가 작성한 문자(글자) 2-gram 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main(void)
{
    char word[10];
    int length;

    printf("단어를 입력하세요>> ");
    scanf("%s", word);

    length = strlen(word);

    for (int i = 0; i < length; i++)
    {
        if (i == length - 1)
            break;

       printf(">> %c%c\n", word[i], word[i + 1]);
    }

    return 0;
}


책에 나와 있는 문자(글자) 2-gram 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main(void)
{
    char text[30] = "Hello";
    int length;

    length = strlen(text);

    for (int i = 0; i < length - 1; i++)
    {
        printf("%c%c\n", text[i], text[i + 1]);
    }

    return 0;
}


내가 작성한 단어 2-gram 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main(void)
{
    char text[100] = "this is c language";
    char* arr[50] = { NULL, };
    char* ptr = strtok(text, " ");

    int count = 0;

    while (ptr != NULL)
    {
        arr[count] = ptr;
        count++;

        ptr = strtok(NULL, " ");
    }

    for (int i = 0; i < count; i++)
    {
        if (arr[i + 1] == NULL)
            break;

        printf("%s %s\n", arr[i], arr[i + 1]);
    }

    return 0;
}


책에 나와 있는 단어 2-gram 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main(void)
{
    char text[100] = "this is c language";
    char* tokens[30] = { NULL, };
    char* ptr = strtok(text, " ");
    
    int count = 0;

    while (ptr != NULL)
    {
        tokens[count] = ptr;
        count++;

        ptr = strtok(NULL, " ");
    }

    for (int i = 0; i < count - 1; i++)
    {
        printf("%s %s\n", tokens[i], tokens[i + 1]);
    }

    return 0;
}