본문 바로가기
Programming/Project Euler

[C/C++] 프로젝트 오일러 #17 : 영어 단어의 글자수 세기(구현)

by 작은별하나 2015. 1. 14.

Project Euler 17번 문제는 1부터 1000까지의 모든 숫자를 영어 단어로 썼을 때 사용되는 글자의 총 개수를 구하는 문제입니다.

예를 들어, 숫자 342는 "three hundred and forty-two"로 쓰고, 115는 "one hundred and fifteen"으로 씁니다. 이때 띄어쓰기나 하이픈('-')은 글자 수에 포함하지 않습니다.

문제는 1부터 1000까지의 모든 숫자를 영어 단어로 썼을 때 사용되는 글자의 총 개수를 구하는 것입니다.

 

이번 문제는 문제 자체의 난이도보다는, 영어 단어를 세는 것 자체가 너무 짜증났던 문제입니다.  그리고 우리가 보통 사용하지 않는 'and'까지 쳐서 해주어야 하니까요.

 

답을 썼는데 계속 틀리다고 나와서, 왜 그런가 했더니, 제가 글자수 하나를 더 쳤네요.  18 과 80 때문에 둘다 그랬네요.  단순하게 8(eight) + 'teen' 과 8(eight) + 'ty' 로 해서 5+4, 5+2 했던 것이 문제였네요.

 

그냥 #1 부터 계속 풀어보자 생각했던터라, 이 문제를 풀고 싶지는 않았지만, 그냥 풀어 보았습니다.

 

counting number letters

 

제가 작성한 소스입니다.

//------------------------------------------------
//    Project Euler #17 - Number Letter Counts
//        - by Aubrey Choi
//        - created at 2015-01-14
//------------------------------------------------
#include <stdio.h>

int main()
{
    int wc[20] = { 0, 3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8 };
    int wct[20] = { 0, 0, 6, 6, 5, 5, 5, 7, 6, 6 };
    int hundred = 7;
    int thousand = 8;
    int andword = 3;

    int sum = 0;
    for( int i = 1 ; i <= 1000 ; i++ )
    {
        int t = i/1000;
        int h = (i/100)%10;
        int s = (i%100>=20)?(i/10)%10:0;
        int v = (i%100>=20)?i%10:i%100;

        int r = 0;
        if( t ) r += wc[t]+thousand;
        if( h ) r += wc[h]+hundred;
        if( s ) r += wct[s];
        if( v ) r += wc[v];
        if( (t | h) && (s | v) ) r += andword;
        sum += r;
    }
    printf("Ans = %d\n", sum);
}

 

반응형

댓글