뭔 이런 문제가 프로젝트 오일러에 나오나 모르겠다…

1부터 1000까지를 영어로 읽은 것의 알파벳 수를 세라니… ㅋㅋㅋ


곰곰 생각해보면 짚어야 할 포인트가 몇 개 있다.


1. 단어를 그대로 쓸 필요는 없다. 단지 알파벳 개수만 세면 된다.


2. 1~20은 그냥 대입하는 거다.


3. 30, 40, 50 ~ 90은 13~19에서 teen을 ty로 바꾼 것이니 2를 빼면 된다.

    단, fortyfourteen은 이 규칙에서 예외


4. 100이 넘으면 100자리 뒤에 and가 붙는다.


5. 필요한 함수들을 별도로 짜면 더 복잡해지고, 하나를 재귀적으로 짜는 게 더 깔끔하다.


대략 이 정도로 짜면 괜찮은 거 아닐까 생각된다…


#include <stdio.h>

int getWordCount(int num)
{
    // 1~20의 글자수는 아래와 같음
    static int counts[] = {
        3, 3, 5, 4, 4, 3, 5, 5, 4, 3,
        6, 6, 8, 8, 7, 7, 9, 8, 8, 6
    };

    // 범위 밖이면 무시
    if ((num < 1) || (num > 1000)) return 0;

    // 1000(one thousand)는 별도로 처리
    if (num == 1000) return 11;

    // 1~20
    if (num <= 20) {
        return counts[num - 1];
    }

    // 30, 40 ... 90
    if (num < 100 && !(num % 10)) {
        // 30~90은 13~19에서 teen을 ty로 바꾼 것과 동일
        // 즉, 2를 빼면 됨
        // 단, fourteen vs forty는 예외
        if (num == 40) return 5;
        return counts[(num / 10) - 3 + 12] - 2;
    }

    // 100, 200, 300 ... 900
    if (num > 99 && !(num % 100)) {
        // hundred만 붙이면 됨
        return 7 + getWordCount(num / 100);
    }

    if (num < 100) {
        return getWordCount((num / 10) * 10) + getWordCount(num % 10);
    }
    else {
        // 100을 초과하면 사이에 and가 붙음
        return getWordCount((num / 100) * 100) + 3 + getWordCount(num % 100);
    }
}

int main(int argc, char* argv[])
{
    int total = 0;
    for (int i = 1; i <= 1000; i++) {
        int now = getWordCount(i);
        printf("%d: %d\n", i, now);
        total += now;
    }

    printf("total count = %d\n", total);
    return 0;
}



신고

+ Recent posts