본문바로가기
[오일러 프로젝트] 라이프니츠네 반찬: 십진법과 이진법에서 모두 대칭수인 100만 미만의 수의 합은 얼마일까?
수학동아 2020.10.27 14:28 조회 705

 

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

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

 

 

세기의 수학자 고트프리트 빌헬름 라이프니츠가 수학을 어떻게 요리하는지,

그 비법을 알려주는 ‘라이프니츠네 반찬’에 오신 것을 환영합니다!

그가 수십 년 동안 쌓은 수학 지식을 알려줄 예정이에요.

잠깐! 오늘 사용할 재료들이 모두 숫자 0과 1을 닮았네요.

0과 1을 재료로 한 수학 개념이라면… 설마?

 

 

<오일러 프로젝트 36번>

순서대로 읽으나 거꾸로 읽으나 같은 수를 ‘대칭수’ 또는 ‘팰린드롬 수’라고 합니다.

100만 미만의 수 중에서 십진법과 이진법으로 나타냈을 때

모두 대칭수인 수의 합은 얼마일까요?

 

우리가 주로 0부터 9까지의 숫자로 수를 표현하는 십진법을 사용하는 반면, 인공지능의 기반이 되는 컴퓨터는 독일의 수학자 고트프리트 빌헬름 라이프니츠가 정립한 0과 1, 두 개의 숫자로 수를 나타내는 이진법을 사용합니다.  따라서 컴퓨터는 우리가 사용하는 십진수를 이진수로 바꿔서 받아들여야 하는데요, 파이썬의 명령어를 이용해 십진수를 이진수로 바꾸고, 36번 문제를 해결해보겠습니다.

 

 

파이썬 완전정복! '십진법과 이진법에서 대칭수 찾기'

 

1. 자연수 n이 십진법, 이진법에서 모두 대칭수인지 확인하기

지난 3월호에서 다뤘던 오일러 프로젝트 4번 문제를 기억하나요? 먼저 ‘str 함수’로 숫자를 문자열로 바꾸고 s = s[::-1] 명령어로 문자열을 뒤집은 뒤, 원래 문자열과 같은지 비교했었죠. 이번에도 같은 방법으로 대칭수를 찾습니다. 단, 십진수를 이진수로 바꿔서 대칭수인지도 확인해야 하는데요, 다행히 파이썬에는 십진수를 이진수로 바꾸는 ‘bin 함수’가 있습니다.

예를 들어 2020를 bin 함수를 이용해 바꾸면 이진수라는 것을 나타내는 ‘0b’로 시작해 2020을 이진수로 변환한 ‘11111100100’이 합쳐져 ‘0b11111100100’이라는 문자열이 나옵니다. 이를 활용해 코드를 짜봅시다.

 

 

2. ‘리스트 내포’로 100만 미만의 대칭수 골라내기

위에서 정의한 test_palindrome(n) 함수로 100만 미만까지의 모든 수를 검사해 합을 구할 차례입니다. ‘리스트 내포’라는 새로운 문법을 사용해 for문과 if문을 한 줄에 작성해 실행 속도를 높입니다. 사용법은 간단합니다. 대괄호([]) 안에 조건을 넣어 나타내면 되죠. 만약 1 이상 10 미만인 자연수를 모두 나열하고 싶다면 아래와 같이 씁니다.

 

 

여기에 if문으로 조건을 추가해 100만 미만의 대칭수들을 골라내는 코드를 만듭니다.

 

 

 

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

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

 

 

#1~4 자연수 n을 십진법 문자열(a), 이진법 문자열(b)로 바꾼 뒤 앞뒤가 같은 대칭수인지 확인하는 test_palindrome(n) 함수를 만듭니다.

#5 십진법, 이진법에서 모두 대칭수인 100만 미만의 자연수를 찾아 그 합을 구하는 함수 e036(n=1000000) 을 정의합니다.

#6 앞서 정의한 test_palindrome 함수를 만족하는 100만 미만의 수를 모두 찾아 더합니다.

#7 e036 함수를 실행해 답을 출력합니다.

 

 

Bonus! 오일러 퀴즈

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

 

① 십진법, 이진법에서 모두 대칭수인 200만 미만 수의 합은 얼마인지 구해보자.

    Hint. ‘def e036(n=1000000):’에서 n의 값을 바꿔 대입해보자.

 

② 십진법, 이진법에서 모두 대칭수인 100만 미만의 수를 나열해보자.

    Hint. ‘return sum([i for i in range(1,n) if test_palindrome(i)])’ 중 일부를 지워보자.

 

  •  
    space Lv.8 2020.10.27 17:16 비밀댓글
    확인요청중
    비밀 댓글이 등록 되었습니다.
    댓글 작성하기 댓글수1
    •  
      홍아름_기자 Lv.4 2020.11.23 16:50

       

      와아아아 space 친구! 두 문제 다 정답이에요~!

      엇ㅜ 제가 너무 확인이 늦었죠ㅠㅠ 다음 오일러 프로젝트 문제도 같이 풀어봐요~

       

      좋아요0
  •  
    ILOVECODE Lv.1 2020.10.31 10:01

    저거 str은 string(파이썬에서는 문장을 나타냄)의 약자에요

    댓글 작성하기 좋아요1 댓글수1
    •  
      홍아름_기자 Lv.4 2020.11.23 16:51

       

      오 맞아요~ 문자열을 뜻하는 표현이랍니다!

       

      좋아요0
  •  
    17수락 Lv.8 2020.11.02 22:49 비밀댓글
    확인요청중
    비밀 댓글이 등록 되었습니다.
    댓글 작성하기 댓글수1
    •  
      홍아름_기자 Lv.4 2020.11.23 16:53

       

      36번 답도 예제 1번 문제도 정답이에요!

      다만~ 예제 2번이 조금 아쉽네요ㅠㅠ 혹시 코드를 어떻게 바꿨는지 댓글로 달아줄 수 있을까요?

       

      좋아요0
  •  
    파이애플 Lv.3 2020.11.19 20:31 비밀댓글
    확인요청중
    비밀 댓글이 등록 되었습니다.
    댓글 작성하기 댓글수1
    •  
      홍아름_기자 Lv.4 2020.11.23 16:53

       

      오오 파인애플 친구~ 두 문제 다 정답이에요~!

       

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

  • ☎문의 02-6749-3911