파이썬_실전 프로젝트

프로젝트 오일러 17번문제 - 숫자-알파벳 변환후 글자수카운트

If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total.

If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used?

 

NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 letters. The use of "and" when writing out numbers is in compliance with British usage.

 

1부터 1000까지의 숫자를 영어표기법으로 바꾼후에, 글자수를 세는 문제입니다.

영어표기법중 and를 넣는 부분이 좀 헷갈려서 헤맸습니다. 100이상부터는 무조건 백과 십자리 사이에 and를 넣어줍니다.

숫자조합은 아래 리스트만으로 가능합니다.

one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve
thirteen
fourteen
fifteen
sixteen
seventeen
eighteen
nineteen
twenty
thirty
forty
fifty
sixty
seventy
eighty
ninety

 

plan:

1. 위 리스트를 파일에 저장해 뒀다가, 실행하면 불러옵니다.

2. 1부터 1000까지 반복문을 만들고, 숫자를 텍스트로 바꾸는건 서브함수로 빼냅니다.

3.  서브함수에서는 숫자를 판단해서, 텍스트로 바꾸는 작업을 합니다. 큰자리부터 변환하고, 처리한수만큼 차감하고, 남은수를 변환된 텍스트와 함께 재귀호출로 같은 함수에 다시 입력해줍니다. 그리고 수가 0이되면 전체 텍스트를 반환해줍니다.

 

coding:

filename = 'q017_data.txt'
with open(filename) as file_object:
    lines = file_object.readlines()

먼저 저장해뒀던 텍스트 리스트를 라인단위로 읽어옵니다.

그리고 루프문을 만듭니다.

def make_string(number,string=''):
    return string

i=0;string_i='';length_i=0;total_length=0
while i<1000:
    print("loop:",i,end='') #프린트문으로 루프 확인.
	string_i=make_string(i)  #함수 호출.
	print(" string_i:",string_i,end='') #프린트문으로 텍스트 확인
	length_i=len(string_i)
	print(" length_i:",length_i,end='') #프린트문으로 길이 확인
	total_length=total_length+length_i
	print(" total_length:",total_length)
	i += 1
print("total_length :",total_length)

항상 그렇지만, 루프문에서는 값이 잘나오고 있는지 확인하는게 중요합니다.

이어서 서브함수입니다.

def make_string(number,string=''):
    charNum=str(number)
	lenNum=len(charNum)
	if lenNum==3:
		string=lines[int(charNum[0])-1].rstrip()+"hundred"
		number = number - int(charNum[0]) * 100
		if number==0:
			return string
		string=make_string(number,string+"and")
	elif number<100 and number > 20:
		string=string+lines[int(charNum[0])+17].rstrip()
		number=number-int(charNum[0])*10
		string=make_string(number,string)
	elif number != 0 and number <= 20:
		string = string+lines[number-1].rstrip()
	return string

문자와 숫자를 왔다갔다 하면서, 코딩을 하느라, 좀 복잡해 보입니다. 크게 if문으로 숫자의 크기를 판단에 따라 코드를 나눴습니다. 좀 더 좋은 방법이 있을것 같은데, 일단 생각나는데로 했네요.

댓글

댓글 본문
작성자
비밀번호
버전 관리
노마드
현재 버전
선택 버전
graphittie 자세히 보기