본문바로가기
[오일러 프로젝트] 파이썬을 넘는 녀석들: 가장 큰 1~9 팬디지털 수는 무엇일까?
수학동아 2021.11.18 11:24 조회 63

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

코딩(프로그래밍)의 ‘코’자도 모르는 홍 기자가 수학 문제를 코딩으로 푸는 오일러 프로젝트 문제에 도전합니다. 오일러 프로젝트는 수학과 코딩 실력을 모두 키울 수 있도록 2001년에 만든 수학 문제 웹사이트입니다. 홍 기자와 함께 수학과 파이썬 모두 정복하세요.

 

 

지난 일 년을 돌아보는 12월입니다. 여러분은 어떤 한 해를 보냈나요?

저는 2020년부터 올해까지 장장 2년 동안 수학 문제를 코딩으로 푼 게 기억에 남아요.

이젠 자신있게 말할 수 있을 거 같거든요. 파이썬을 ‘살짝’ 넘었다고요!

 

 

<오일러 프로젝트 38번>

자연수 192에 1, 2, 3을 각각 곱하면 아래와 같습니다.

 

192 × 1 = 192

192 × 2 = 384

192 × 3 = 576

 

이 결과를 모두 이어붙이면 192384576이고, 이는 1부터 9까지의 숫자를 한 번 씩만 써서 만들 수 있는 ‘1~9 팬디지털 수’입니다. 그렇다면 어떤 수에 1, 2, …, n을 각각 곱해 하나로 이어붙였을 때, 얻을 수 있는 가장 큰 1 ~ 9 팬디지털 수는 무엇일까요?

단, n은 1보다 큰 수여야합니다.

 

 

문제를 해결하기 위해 ‘어떤 수’의 범위부터 살펴보겠습니다. ‘어떤 수’는 최대 몇 자리까지 가능할까요? 가장 작은 다섯 자릿수인 10000에 1과 2를 곱하면 각각 10000, 20000이고, 이 두 수를 붙이면 1000020000으로 열 자리입니다. 따라서 ‘어떤 수’는 한 자릿수부터 네 자릿수 사이에서 찾으면 됩니다.

 

38번 문제를 해결하는 코드에서는 ‘어떤 수’를 1부터 가장 큰 네 자릿수인 9999까지 바꿔보면서, 가장 큰 1~9 팬디지털 수를 만드는 경우를 찾아보겠습니다!

 

 

파이썬 완전정복! 가장 큰 팬디지털 수 찾기

38번 문제를 해결하는 데 필요한 파이썬 명령어입니다.

꿀팁 중의 꿀팁, 밑줄 쫙! 핵심만 소개하니 꼭 익혀두세요!

 

1. 1~9 팬디지털 수 만드는 ‘어떤 수’ 찾기

어떤 수를 변수 i로 두고, i에 1, 2, 3, … 을 각각 곱해 하나로 이어붙였을 때 아홉 자리가 되는지 따지고, 된다면 팬디지털 수인지 확인하는 함수 concat_prod(i)를 만듭니다. 이때 만든 수가 1~9 팬디지털 수면 해당 결과를 보여주고, 그렇지 않으면 0을 보여줍니다. 1~9 팬디지털 수인지 알아보기 위해서는 함수 is_pandigital()을 사용합니다. is_pandigital() 함수에서는 i에 1부터 n까지의 자연수를 곱한 결과를 str() 명령어를 이용해 문자열로 바꾸고, 연산자 +로 문자열을 이어붙입니다.

 

 

2. 아홉 자리 팬디지털 수 중에서 가장 큰 수 찾기

앞서 정의한 함수 concat_prod(i)로 i가 1부터 9999 사이일 때 만들 수 있는 팬디지털 수를 모두 얻은 뒤, 함수 e038()로 가장 큰 팬디지털 수를 찾습니다. 이때 최댓값을 찾는 명령어 max를 사용합니다.

 

 

 

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

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

 

 

#1, 2 숫자를 문자열 형태로 이어붙여 1~9 팬디지털 수인지 확인하는 함수 is_pandigital(s)를 만듭니다.

#3~13 어떤 수에 1부터 자연수를 곱한 뒤 결과를 모두 이어붙이고, 함수 is_pandigital(s)로 1~9 팬디지털 수인지 확인하는 함수 concat_prod(i)를 정의합니다.

#14~18 앞의 두 함수를 이용해 가장 큰 1~9 팬디지털 수를 찾는 함수 e038()을 만듭니다.

#19 함수 e038()을 실행해 38번 문제의 답을 얻습니다.

 

 

BONUS 오일러 퀴즈

오일러 프로젝트 38번 문제를 풀어 보고, 다음 예제 문제에도 도전하세요!

 

① 어떤 수 i가 세 자리 이하의 수일 때, 가능한 가장 큰 1~9 팬디지털 수를 구하세요.

Hint. #16의 ‘for i in range(1, 10000):’을 바꿔보세요.

 

② 어떤 수에 1, 2, 3, …을 각각 곱해 이어붙여 얻을 수 있는 가장 큰 1~8 팬디지털 수는 무엇일까요?

 

 

2년 동안 23개의 오일러 프로젝트 문제, 그리고 파이데이 기념 특별 문제 1개를 해결했어요.

덕분에 파이썬을 1도 모르던 저는 간단한 수학 문제를 코딩으로 해결할 수 있게 되었어요! 응용은 아직….ㅜ

저만큼 독자 여러분도 수학과 파이썬에 조금은 가까워졌길 바라요!

다음엔 더 재밌는 코너로 돌아올게요. 감사합니다!

 

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

  • ☎문의 02-6749-3911