뭔 이런 문제가 프로젝트 오일러에 나오나 모르겠다…
1부터 1000까지를 영어로 읽은 것의 알파벳 수를 세라니… ㅋㅋㅋ
곰곰 생각해보면 짚어야 할 포인트가 몇 개 있다.
1. 단어를 그대로 쓸 필요는 없다. 단지 알파벳 개수만 세면 된다.
2. 1~20은 그냥 대입하는 거다.
3. 30, 40, 50 ~ 90은 13~19에서 teen을 ty로 바꾼 것이니 2를 빼면 된다.
단, forty와 fourteen은 이 규칙에서 예외
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;
}