[Project Euler #17][C++] 1부터 1000까지 영어로 썼을 때 사용된 글자의 개수는?
Problem Solving/Project Euler 2021. 1. 4. 02:04728x90
문제17 : 1부터 1000까지 영어로 썼을 때 사용된 글자의 개수는?
문제
1부터 5까지의 수를 영어로 쓰면 one, two, three, four, five 이고,
각 단어의 길이를 더하면 3 + 3 + 5 + 4 + 4 = 19 이므로 사용된 글자는 모두 19개입니다.
1부터 1,000까지 영어로 썼을 때는 모두 몇 개의 글자를 사용해야 할까요?
참고: 빈 칸이나 하이픈('-
')은 셈에서 제외하며, 단어 사이의 and 는 셈에 넣습니다.
예를 들어 342를 영어로 쓰면 three hundred and forty-two 가 되어서 23 글자, 115 = one hundred and fifteen 의 경우에는 20 글자가 됩니다.
문제 해결 방법
- 100 이상의 수의 경우, 100으로 나누어 떨어지는 수(
100
,200
, ...,1000
)를 제외한 수는 백의 자리와 십의 자리 수 사이에and
를 붙여서 계산해야 한다.- 101 : one hundred and one
- 112 : one hundred and twelve
- 121 : one hundred and twenty one
- 배열 과
for
문을 이용하여 문제를 풀었다.
소스 코드
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
using namespace std; | |
#define SIZE 1000 | |
enum { | |
ONE = 1, TWO = 2, THREE = 3, FOUR = 4, FIVE = 5, SIX = 6, SEVEN = 7, EIGHT = 8, NINE = 9, TEN = 10, | |
ELEVEN = 11, TWELVE = 12, THIRTEEN = 13, FOURTEEN = 14, FIFTEEN = 15, SIXTEEN = 16, SEVENTEEN = 17, EIGHTEEN = 18, NINETEEN = 19, TWENTY = 20, | |
THIRTY = 30, FORTY = 40, FIFTY = 50, SIXTY = 60, SEVENTY = 70, EIGHTY = 80, NINETY = 90, HUNDRED = 100, THOUSAND = 1000, AND = 3 | |
}; | |
int main () { | |
int ary[SIZE + 1] = {0}; | |
ary[0] = 0, ary[ONE] = 3; ary[TWO] = 3; ary[THREE] = 5; ary[FOUR] = 4; ary[FIVE] = 4; | |
ary[SIX] = 3; ary[SEVEN] = 5; ary[EIGHT] = 5; ary[NINE] = 4; ary[TEN] = 3; ary[ELEVEN] = 6; | |
ary[TWELVE] = 6; ary[THIRTEEN] = 8; ary[FOURTEEN] = 8; ary[FIFTEEN] = 7; ary[SIXTEEN] = 7; ary[SEVENTEEN] = 9; | |
ary[EIGHTEEN] = 8; ary[NINETEEN] = 8; ary[TWENTY] = 6; ary[THIRTY] = 6; ary[FORTY] = 5; ary[FIFTY] = 5; | |
ary[SIXTY] = 5; ary[SEVENTY] = 7; ary[EIGHTY] = 6; ary[NINETY] = 6; ary[HUNDRED] = 7; ary[THOUSAND] = 8; | |
int sum = 0; | |
for (int i = 1; i <= SIZE; i++) { | |
if (i >= ONE && i <= TEN) { | |
sum += ary[i]; | |
// cout << i << " " << i << " " << sum << endl; | |
} | |
else if (i > TEN && i < HUNDRED) { | |
if (i >= 11 && i < 20) { | |
sum += ary[i]; // 10의 자리 + 1의 자리 | |
} | |
else { | |
if (i % 10 == 0) { | |
sum += ary[(i / 10) * 10]; // 10의 자리 | |
} | |
else { | |
sum += ary[(i / 10) * 10]; // 10의 자리 | |
sum += ary[i % 10]; // 1의 자리 | |
} | |
} | |
// cout << i << " " << (i / 10) * 10 << i % 10 << " " << sum << endl; | |
} | |
else if (i >= HUNDRED && i < THOUSAND) { | |
if (i % 100 == 0) { | |
sum += ary[i / 100]; // 100의 자리 | |
sum += ary[100]; // HUNDRED | |
} | |
else { | |
sum += ary[i / 100]; // 100의 자리 | |
sum += ary[100]; // HUNDRED | |
sum += AND; // AND | |
if ((i % 100) >= 1 && (i % 100) < 10) { | |
sum += ary[i % 10]; // 1의 자리 | |
} | |
else if ((i % 100) >= 10 && (i % 100) < 20) { | |
sum += ary[i % 100]; // 10의 자리 + 1의 자리 | |
} | |
else { | |
sum += ary[((i % 100) / 10) * 10]; // 10의 자리 | |
sum += ary[i % 10]; // 1의 자리 | |
} | |
} | |
// cout << i << " " << i / 100 << ((i % 100) / 10) * 10 << i % 10 << " " << sum << endl; | |
} | |
else { | |
sum += ary[i / 1000]; // 1000의 자리 | |
sum += ary[1000]; // THOUSAND | |
//cout << i << " " << 1000 << " " << sum << endl; | |
} | |
} | |
cout << sum << endl; | |
return 0; | |
} |
정답
21124 |
728x90
'Problem Solving > Project Euler' 카테고리의 다른 글
[Project Euler #16][C++] 의 각 자릿수를 모두 더하면? (0) | 2020.12.31 |
---|---|
[Project Euler #15][C++] 20×20 격자의 좌상단에서 우하단으로 가는 경로의 수 (0) | 2020.12.28 |
[Project Euler #14][C++] 백만 이하로 시작하는 우박수 중 가장 긴 과정을 거치는 것은? (0) | 2020.12.28 |
[Project Euler #13][C++] 50자리 수 100개를 더한 값의 첫 10자리 구하기 (0) | 2020.12.27 |
[Project Euler #12][C++] 500개 이상의 약수를 갖는 가장 작은 삼각수는? (0) | 2020.12.26 |
[Project Euler #11][C++] 20×20 격자에서 연속된 네 수의 곱 중 최댓값 (0) | 2020.12.26 |
[Project Euler #10][C++]이백만 이하 소수의 합 (0) | 2020.12.24 |
[Project Euler #9][C++] a + b + c = 1000 이 되는 피타고라스 수 (0) | 2020.12.23 |