코.알.못 홍 기자의 코딩 도전기
코딩(프로그래밍)의 ‘코’자도 모르는 홍 기자가 수학 문제를 코딩으로 푸는 오일러 프로젝트 문제를 하나하나 해결해 나갑니다. 오일러 프로젝트는 수학과 코딩 실력을 모두 키울 수 있도록 2001년에 만든 수학 문제 웹사이트입니다. 홍 기자와 함께 한다면 수학과 파이썬 모두 정복할 수 있지 않을까요?
사랑을 담당하는 사랑 세포, 배고픔을 유발하는 출출 세포, 그리고 옷차림을 신경 쓰는 패션 세포까지! 드라마 ‘유미의 세포들’의 주인공 유미는 다양한 세포 친구들의 도움을 받아 문제를 해결해 나갑니다. 하지만 슬프게도 유미의 수학 세포는 오랫동안 쓰이지 않아 잠들었네요. 혹시나 이렇게 잠들고 있을 여러분의 수학 세포를 살리기 위해 1부터 9까지의 숫자를 이용한 문제를 풀어 보겠습니다!
<오일러 프로젝트 32번>
1부터 n까지 각 숫자를 한 번씩만 써서 만들 수 있는 수를 ‘1~n 팬디지털’이라고 합니다. 예를 들어 12345는 1부터 5까지의 숫자를 한 번씩만 쓴 1~5 팬디지털 수입니다. 팬디지털로는 곱셈식도 만들 수 있는데, a×b=c에서 a, b, c 자리에 1부터 9까지의 숫자를 한 번씩만 사용해 식을 만든 것을 ‘1~9 팬디지털 곱셈식’이라고 합니다. 그렇다면 가능한 1~9 팬디지털 곱셈식은 모두 몇 가지일까요?
아래 곱셈식은 1부터 9까지의 숫자가 한 번씩만 쓰인 1~9 팬디지털 곱셈식입니다.
a×b=c에서 a, b, c를 이은 것이 1~9 팬디지털이 되려면, 아래의 두 가지 조건을 만족해야 합니다.
조건 ① a, b, c의 각 자릿수를 모두 더하면 9여야 한다.
조건 ② 만약 a, b가 각각 한 자릿수라면 가장 큰 자연수인 9와 8을 골라도, 9×8=72로 c는 두 자릿수입니다. 따라서 a, b, c의 합이 9가 될 수 없지요. 이처럼 a, b를 한 자리씩 늘려가며 가능한 경우를 추리면 단 두 가지만 남습니다.
앞서 찾은 두 조건을 코드로 나타내면 32번 문제의 답을 찾을 수 있습니다.
파이썬 완전정복! ‘팬디지털 곱셈식 판별 코드 만들기’
32번 문제를 해결하는 데 필요한 파이썬 명령어입니다.
꿀팁 중의 꿀팁, 밑줄 쫙! 핵심만 소개하니 꼭 익혀두세요!
1. 숫자를 문자열로 바꾸기
1~9 팬디지털 곱셈식이 되려면 먼저 a, b, c를 이어붙였을 때 1~9 팬디지털이어야 합니다. 그렇다면 세 수를 어떻게 이어붙일 수 있을까요? a=39, b=186, c=7254일 때, 세 수를 이어붙이려면 a에 10000000을 곱하고, b에는 10000을 곱한 다음 c와 모두를 더하는 (a×10000000 + b×10000 + c) 식을 사용해야 abc를 이어붙일 수 있습니다. 하지만 이 방법은 a, b, c가 각각 몇 자릿수인지 미리 알고 있어야 사용할 수 있는 방법입니다. 따라서 이번 문제에서는 ‘문자열’을 사용해 문제를 해결합니다. 먼저 a, b, c의 숫자를 문자열로 바꾸는 ‘str()’ 함수를 사용한 다음, abc로 문자열을 이어붙이는 연산자 ‘+’를 써서 코드를 만듭니다.
2. 문자열로 나타낸 수가 팬디지털인지 확인하기
앞서 얻은 문자열 형태의 숫자를 오름차순으로 정리한 다음 ‘123456789’와 같은지 확인해 팬디지털 수를 가려냅니다. 하지만 파이썬에서는 문자열을 오름차순으로 정렬하는 함수가 없어서, 문자열의 숫자를 하나씩 떼어 오름차순으로 정렬해 주는 ‘sorted()’ 함수를 사용합니다. 그다음 정렬된 결과를 ‘join()’ 함수로 합쳐 하나의 문자열로 다시 만듭니다.
도전! 오일러 프로젝트 32번 문제 뽀개기
* 코딩 언어는 Python으로 두고 실행하세요!
#4, 5 a×b=c에서 문제의 답은 c가 항상 네 자릿수이며 a, b, c를 이어붙인 수가 팬디지털이어야 합니다. 따라서, c가 네 자릿수인지 범위를 확인하고, 앞서 정의한 is_pandigital() 함수를 이용해 팬디지털 조건을 만족하는지 확인하는 함수 check_abc()를 정의합니다.
#6 32번 문제의 답을 구하는 함수 e032()를 정의합니다.
#7, 8, 9, 10 a×b=c에서 abc가 1~9 팬디지털이 되는 자릿수의 조건 중 하나인 ‘a는 한 자릿수, b는 네 자릿수, 그리고 a와 b를 곱한 c는 네 자릿수’라는 것을 이용해 가능한 경우의 수를 골라냅니다. 같은 방식으로 a×b=c가 1~9 팬디지털 곱셈식이 되는 두 번째 조건인 ‘a는 두 자릿수, b는 세 자릿수, c는 네 자릿수’여야 하는 점을 #7~10에 적용해 실행하면 두 번째 조건을 만족하는 답을 얻을 수 있습니다.
#11, 12 위 조건을 만족하는 a×b=c를 모두 출력합니다.
BONUS 오일러 퀴즈
오일러 프로젝트 32번 문제를 풀어 보고, 다음 예제 문제에도 도전하세요!
① 위의 #7~10의 코드를 응용해 가능한 1~9 팬디지털 곱셈식을 모두 구하세요.
Hint. #7~10의 코드에서 a와 b의 범위를 바꾼 코드를 e032()에 넣어 실행해 보세요.
② 1부터 8까지의 숫자를 사용해 만들 수 있는 1~8 팬디지털 곱셈식의 가짓수를 구하세요.
1부터 9까지 숫자들을 나열해야 하는 32번 문제라면 잠시 잠들어있던 유미의 수학 세포도 살아날 수 있겠죠? 드라마 ‘유미의 세포들’에서는 특별히 활동을 많이 하는 세포를 ‘프라임 세포’라고 하는데요, 수학동아를 읽는 동안에는 여러분들의 프라임 세포가 수학 세포이길 바랍니다! 자장자장 세포나 시러시러 세포는 안 돼요!