사이트 이름 - 문제 17번
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까지는 기억나는데 그 이후론 사용을 안하니 모르겠다.ㅠㅠ (일단 공부했고, 이건 따로 정리를 안해야겠다..길어서 지금은 시간이 없으므로)
천 까지 쓸 영어에 필요한 단어들을 정리
아주 그냥 무식하게 풀었다.ㅎㅎ;;;;
1,000개 짜리 빈 리스트를 만들고, 중복이 되지 않는 수들만 미리 배열에 넣어둔다.
그 이후 21에서 99까지 for 문으로 숫자에 해당하는 글자를 만들어 해당하는 리스트번호에 넣는다.
101번 째 부터 999번째 까지도 동일하게 처리한다.
그러면 1,000 까지 숫자에 해당하는 문자가 찍힌다.
마지막으로 문자를 카운트 하는데 None이나 공백, - 등의 문자는 replace 함수로 처리하고 순수 문자의 개수만 카운트하면 답이 나온다.
numbers_string = [None] * 1001
numbers_string[1] = 'one'
numbers_string[2] = 'two'
numbers_string[3] = 'three'
numbers_string[4] = 'four'
numbers_string[5] = 'five'
numbers_string[6] = 'six'
numbers_string[7] = 'seven'
numbers_string[8] = 'eight'
numbers_string[9] = 'nine'
numbers_string[10] = 'ten'
numbers_string[11] = 'eleven'
numbers_string[12] = 'twelve'
numbers_string[13] = 'thirteen'
numbers_string[14] = 'fourteen'
numbers_string[15] = 'fifteen'
numbers_string[16] = 'sixteen'
numbers_string[17] = 'seventeen'
numbers_string[18] = 'eighteen'
numbers_string[19] = 'nineteen'
numbers_string[20] = 'twenty'
numbers_string[30] = 'thirty'
numbers_string[40] = 'forty'
numbers_string[50] = 'fifty'
numbers_string[60] = 'sixty'
numbers_string[70] = 'seventy'
numbers_string[80] = 'eighty'
numbers_string[90] = 'ninety'
numbers_string[100] = 'one hundred'
numbers_string[200] = 'two hundred'
numbers_string[300] = 'three hundred'
numbers_string[400] = 'four hundred'
numbers_string[500] = 'five hundred'
numbers_string[600] = 'six hundred'
numbers_string[700] = 'seven hundred'
numbers_string[800] = 'eight hundred'
numbers_string[900] = 'nine hundred'
numbers_string[1000] = 'one thousand'
for i in range(20, 100, 10):
for j in range(1, 10):
idx = i + j
numbers_string[idx] = numbers_string[i] + " " + numbers_string[j]
for i in range(1, 10):
for j in range(1, 100):
idx = (i * 100) + j
numbers_string[idx] = numbers_string[i] + " hundred and " + numbers_string[j]
letters_cnt = 0
for num in numbers_string:
if num is None:
continue
letters = num.replace(" ", "")
letters = letters.replace("-", "")
letters_cnt += len(letters)
print(letters_cnt) # 21124
print(numbers_string)
진심 겁나 무식하게 풀었네..ㅠㅠ
아래 다른이의 해결 방법처럼도 생각 했었는데...왜 이렇게 어렵게 풀었을려나...
어쨌든 더 열심히 공부해야겠다.
다른이의 해결 방법
처음부터 숫자로만 처리하는 방법
def num1(x):
if x>=0 and x<=10:
n=[0,3,3,5,4,4,3,5,5,4,3]
return n[x]
if x>10 and x<20:
n=[6,6,8,8,7,7,9,8,8]
return n[x-11]
def num2(x):
if x<20:
return num1(x)
if x>=20 and x<100:
n=[6,6,5,5,5,7,6,6]
return n[(x//10)-2]+num1(x%10)
def num3(x):
if x<100:
return num2(x)
if x>=100:
a=x//100
b=x%100
if b==0:
return num1(a)+7
else:
return num1(a)+num2(b)+10
S=11
for i in range(1,1000):
S+=num3(i)
print(S)
내가 푼 방법과 비슷하지만 더 간단한 방법
sum=0
num = ['one','two','three','four','five','six','seven','eight','nine','ten','eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen','eighteen','nineteen']
tens = ['twenty','thirty','forty','fifty','sixty','seventy','eighty','ninety']
for ten in tens:
num.append(ten)
for item in range(0,9):
num.append(str(ten + num[item]))
for hun in range(0,9):
num.append(str(num[hun] + 'hundred'))
for hundigit in range(0,99):
num.append(str(num[hun]+'hundredand'+num[hundigit]))
num.append('onethousand')
for n in num:
sum+=len(n)
print(sum)
'프로그래밍 > 알고리즘' 카테고리의 다른 글
100! 의 자릿수를 모두 더하면? (0) | 2021.02.08 |
---|---|
2의 1000제곱의 각 자릿수를 모두 더하면? (0) | 2021.02.06 |
백만 이하로 시작하는 우박수 중 가장 긴 과정을 거치는 것은? (0) | 2021.02.05 |
50자리 수 100개를 더한 값의 첫 10자리 구하기 (0) | 2021.02.04 |
500개 이상의 약수를 갖는 가장 작은 삼각수는? (0) | 2021.02.03 |