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 부터 계속 풀어보자 생각했던터라, 이 문제를 풀고 싶지는 않았지만, 그냥 풀어 보았습니다.
제가 작성한 소스입니다.
//------------------------------------------------
// 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);
}
반응형
'Programming > Project Euler' 카테고리의 다른 글
[C/C++] 프로젝트 오일러 #19 : 20세기의 매달 1일이 일요일인 수 계산하기 (0) | 2015.01.17 |
---|---|
[C/C++] 프로젝트 오일러 #18 : 삼각형 수들의 최대값 경로 구하기(동적 프로그래밍) (0) | 2015.01.14 |
[C/C++] 프로젝트 오일러 #16 : 2의 1000승의 모든 자릿수 합 구하기(BigInteger) (0) | 2015.01.13 |
[C/C++] 프로젝트 오일러 #15 격자 경로의 수 구하기(조합) (0) | 2014.12.31 |
[C/C++] 프로젝트 오일러 #14 Longest Collatz Sequence(동적 프로그래밍) (0) | 2014.12.30 |
댓글