본문바로가기
[오일러 프로젝트] 코딩 지니: 1부터 1000까지 영어로 썼을 때 사용한 글자수는?
수학동아 2020.06.23 01:10 조회 1494

 

코.알.못 홍 기자의 코딩 도전기

코딩의 ‘코’자도 모르는 코.알.못. 홍 기자가 수학 문제를 코딩으로 푸는 오일러 프로젝트 문제를 하나하나 해결해 나갈 예정입니다. 오일러 프로젝트는 수학과 프로그래밍 실력을 모두 키울 수 있도록 2001년에 만든 수학 문제 웹사이트입니다. 홍 기자와 함께한다면 수학과 파이썬 모두 정복할 수 있지 않을까요?

 

 

영화 ‘알라딘’을 봤거나 ‘알라딘과 요술 램프’ 이야기를 아는 사람이라면

소원을 들어주는 지니를 한 번쯤 만나고 싶어 하죠.

그런데 오일러 프로젝트에 코딩 지니가 나타났습니다.

풀고 싶은 문제를 모두 말해주세요! 어렵지 않다면 해결해 드릴게요!

 

 

<오일러 프로젝트 17번>

1부터 5까지의 숫자를 영어로 쓰면 one, two, three, four, five입니다.

이때 각 단어의 글자 수를 더하면 3+3+5+4+4=19입니다.

같은 방식으로 1부터 1000까지 영어로 썼을 때 사용한 글자 수는 몇 개일까요?

 

 

17번 문제에서는 수를 읽고 쓰는 내용을 다룹니다. 우리나라에서는 10진법에 맞춰 십, 백, 천 등의 단위로 수를 읽지만, 영어는 조금 다른데요, 이번 오일러 프로젝트에서는 영어로 숫자를 읽는 방식을 코드로 나타내 보겠습니다.

(문제 해결을 의뢰한 '나랃말싸미 듕귁에'님, 보고 계시죠~?)

 

 

파이썬 완전정복! 필수 명령어

 

1. 두 자릿수까지 읽는 함수

1부터 19까지는 규칙 없이 각각 다른 이름이 붙기 때문에 리스트로 일일이 지정해줘야 합니다. 리스트 s1에 s1 = [ ‘ ’, ‘one’, ‘two’, … , ‘nineteen’]을 저장합니다.

20부터 99까지는 한자처럼 10진법 체계로 읽으니 읽으려는 수를 10으로 나누는 방법을 써서 함수로 나타냅니다. 몫이 십의 자릿수, 나머지가 일의 자릿수가 되며, 십의 자릿수에 대응하는 영어 이름을 읽고 그 뒤에 일의 자릿수의 이름을 붙이면 됩니다.

 

 

2. 서너 자릿수를 읽는 함수

백의 자릿수를 읽는 방법도 십의 자릿수와 비슷하게 100으로 나눈 몫에 hundred를 붙여 읽습니다. 그리고 나머지는 일, 십의 자릿수를 읽었던 코드로 읽습니다. 주의할 점은 나머지가 0일 때는 백의 자릿수만 읽고, 0이 아니라면 백과 십의 자릿수 사이에 and를 넣어야 합니다. 200은 two hundred, 345는 three hundred and forty five로 읽는 것처럼요. 마지막으로 1000은 one thousand이므로 ans=‘onethousand’로 나타냅니다.

 

 

 

TIP1. 리스트를 만들 때 첫 번째 값은 항상 0번입니다. 따라서 리스트의 1번에 1을 뜻하는 one을 대응시키려면 첫 번째 값은 빈칸으로 비워 두고 코드를 짜야 합니다. 리스트 s2에서도 마찬가지로요!

 

TIP2. 코딩과 관련된 팁은 아니지만, 영어로 20 이상의 수를 읽을 때는 십의 자릿수에 맞춰 twenty(20), thirty(30) 같은 이름을 붙입니다. 그 다음 40을 나타내는 단어는 four에 ty를 붙인 단어일 것 같지만, 아닙니다! fourty가 아니라 forty지요. 저만 헷갈리는 거 아니죠?

 

 

도전! 오일러 프로젝트 17번 문제 뽀개기

* 코딩 언어는 Python으로 두고 실행하세요!

 

 

#1 앞서 짠 코드를 엮어 ‘num2eng(n)’을 만듭니다.

#4~10 1부터 1000까지 영어로 읽는 규칙을 넣어줍니다. 각각의 규칙은 if … elif … elif … else 문을 이용해 넣는데, 여러 조건을 잇는 명령어로 앞에서부터 맞는 조건을 찾으면 해당 코드를 실행합니다.

#5 1부터 19까지의 숫자라면 리스트 s1에서 영어 이름을 찾아 바꿉니다.

#6 19보다 크고 99보다는 작거나 같은 수라면 오른쪽 코드에 맞춰 영어로 바꿉니다.

#7~9 99보다 크고 999보다 작거나 같은 수라면 코드에 맞춰 영어로 바꿉니다.

#10 #5~7의 세 조건을 만족하지 않는 수인 1000은 'onethousand'로 바꿉니다.

#11 숫자를 조건에 맞춰 영어 이름으로 바꿉니다

 

 

Bonus! 오일러 퀴즈

 

오일러 프로젝트 17번 문제를 위 코딩창에서 풀어보고, 다음 예제 문제에도 도전해보세요!

 

1. 1부터 500까지의 숫자를 영어로 썼을 때 총 글자수는?

Hint ‘for i in range(1, 1001):’에 들어가는 수를 바꿔보세요!

 

2. 1부터 15까지의 숫자를 영어로 썼을 때 각 글자수를 곱한 값은?

Hint ‘cnt = 0’, ‘for i in range(1, 1001):’, ‘cnt = cnt + len(num2eng(i))’

에 들어가는 숫자와 연산자를 바꿔보세요!

 

 

오일러 프로젝트 사상 처음으로 독자의 요청을 받아 문제를 풀어봤습니다!

다음에는 ‘최산’ 님이 댓글로 요청해주신 45번 문제를 풀어볼 건데요,

삼각수, 오각수, 육각수 등 기하학적인 수에 대해 다룬답니다!

오일러 문제 제보는 계속해서 받고 있으니 댓글로 참여해주세요~!

 

  •  
    매스파이 Lv.8 2020.06.24 01:02

    제가 5월호 문제에 8월호에서 풀 문제를 잘못 입력했네요.삼각수도 되고,오각수도 되고,육각수도 되는 두 번째로 작은 수를 찾는 문제입니다.

    댓글 작성하기 좋아요0 댓글수1
    •  
      홍아름_기자 Lv.5 2020.07.13 17:35

       

      넵! 다음 수학동아 8월호에서 45번 문제를 푸는 과정을 확인해주세요~!

       

      좋아요0
  •  
    space Lv.8 2020.06.24 22:03 비밀댓글
    확인요청중
    비밀 댓글이 등록 되었습니다.
    댓글 작성하기 댓글수3
    •  
      space Lv.8 2020.07.01 04:24

      def num2eng(n):
         s1 = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen']
         s2= ['', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety']
         if n < 1 or n > 1000: ans = 'error!'
         elif n <= 19: ans = s1[n]
         elif n <= 99: ans = s2[n//10] + s1[n%10]
         elif n <= 999:
            ans = s1[n//100] + 'hundred'
            if n % 100 != 0: ans = ans + 'and' + num2eng(n%100)
         else: ans = 'onethousand'
         return ans
      cnt = 0
      for i in range(1, 501):
         cnt = cnt + len(num2eng(i))
      print(cnt)

      좋아요0
    •  
      홍아름_기자 Lv.5 2020.07.13 17:36

       

      와~ (짝짝짝)

       

      좋아요0
    •  
      외계파이 Lv.4 2020.07.17 20:43

      보너스 퀴즈 2번

      def num2eng(n):
         s1 = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen']
         s2= ['', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety']
         if n < 1 or n > 1000: ans = 'error!'
         elif n <= 19: ans = s1[n]
         elif n <= 99: ans = s2[n//10] + s1[n%10]
         elif n <= 999:
            ans = s1[n//100] + 'hundred'
            if n % 100 != 0: ans = ans + 'and' + num2eng(n%100)
         else: ans = 'onethousand'
         return ans
      cnt = 1
      for i in range(1, 15):
         cnt = cnt * len(num2eng(i))
      print(cnt)

      좋아요0
  •  
    Einstein Lv.2 2021.03.07 04:44

    21124

    댓글 작성하기 좋아요0 댓글수0
  • 폴리매스 문제는 과학기술진흥기금 및 복권기금의 재원으로 운영되고, 과학기술정보통신부와 한국과학창의재단의 지원을 받아 수행된 성과물로 우리나라의 과학기술 발전과 사회적 가치 증진에 기여하고 있습니다.

  • ☎문의 02-6749-3911