예능 프로그램 ‘뭉쳐야 쏜다’는 다양한 스포츠 종목에서 국가대표로 활약했던 12명의 전설을 모아
농구대결을 합니다. 각자 분야에서는 금메달감이지만 모여서 농구를 하면 이상하게 패하기 일쑤라
“모이면 (겨우) 1승, 흩어지면 12승”이라 말할 정도죠. 그렇다면 만약 국가대표 대신 전설의 레전드 수학자 10명이 모여 농구 경기를 하면 어떨까요? 과연 ‘LEGEND IS BACK?’일지?
전설의 수학자라고 하면 누가 떠오르나요? 저는 일단 코치인 레온하르트 오일러를 제외하고 피타고라스, 에우클레이데스(유클리드), 고트프리트 빌헬름 라이프니츠, 조제프 루이 라그랑주, 카를 프리드리히 가우스, 아우구스트 페르디난트 뫼비우스, 닐스 헨리크 아벨, 에바리스트 갈루아, 앙리 푸앵카레, 다비트 힐베르트까지 10명을 떠올렸습니다. 그런데 농구는 1891년이 돼서야 등장한 스포츠라 이 수학자들은 해보지 못했을 거예요. 각자 어떤 장·단점을 가질지 예측조차 할 수 없죠. 일단 무작위로 팀과 포지션을 나눠 경기를 해봐야겠습니다.
농구는 5명으로 이뤄진 2개의 팀이 만나 경기하는 종목입니다. 따라서 총 10명의 선수가 필요합니다. 각 팀에는 ① 포인트 가드, ② 슈팅 가드, ③ 스몰 포워드, ④ 파워 포워드, ⑤ 센터의 자리가 있죠. 그럼 전설의 수학자 10명에게 0부터 9번까지의 등번호를 주고, 팀과 자리를 나누는 경우의 수는 몇 가지일까요?
농구장에서 각 팀의 5개 포지션은 그림과 같이 나타낼 수 있습니다. 표의 빈칸에 0부터 9까지 수학자의 등번호를 중복되지 않게 채워 수학자들을 배치할 수 있죠.
그럼 이때 가능한 경우의 수는 얼마일까요? A팀의 ①번부터 채워보겠습니다. 먼저 A-①에는 0부터 9까지 10개의 번호가 들어갈 수 있습니다. 그리고 이 중 하나를 골라 채우면 총 9개의 번호가 남지요. 따라서 그다음인 A-②에는 9개의 번호가 들어갈 수 있습니다. 이런 식으로 B-⑤까지 따지면 각각 10, 9, 8, 7, 6, 5, 4, 3, 2, 1가지의 경우의 수가 있습니다.
그런데 이 모든 경우의 수는 동시에 일어나야 합니다. 따라서 각각 가능한 경우의 수를 곱한 값인 362만 8800가지(=10×9×8×7×6×5×4×3×2×1)가 됩니다. 휴, 이렇게 많은 경우의 수 중에서 어떤 걸 골라야 하죠? 고민되지만, 오일러 프로젝트 24번 문제에서 영감을 받아 0부터 9까지의 수를 배치해 만들 수 있는 순열을 사전식으로 배열해 100만 번째에 있는 순열에 따라 수학자들을 배치해보겠어요!
※ 편집자 주
코딩(프로그래밍)의 ‘코’자도 모르는 코.알.못. 홍 기자가 수학 문제를 코딩으로 푸는 오일러 프로젝트 문제를 하나하나 해결해 나갑니다. 오일러 프로젝트는 수학과 코딩 실력을 모두 키울 수 있도록 2001년에 만든 수학 문제 웹사이트입니다. 홍 기자와 함께한다면 수학과 코딩 언어의 하나인 파이썬 모두 정복할 수 있지 않을까요?
1. 1부터 n까지 자연수를 곱하는 팩토리얼(!)로 경우의 수 나타내기
0부터 9까지의 수를 나열하는 방법은 362만 8800가지입니다. 이는 10개부터 1개까지 점차 줄어드는 경우의 수를 곱한 것으로 마지막 수인 10을 써서 10!로 나타내지요. 그렇다면 이중에서 0으로 시작하는 수는 몇 개일까요? 가장 앞의 숫자가 고정돼 있으니 0 다음으로 올 수 있는 숫자의 가짓수인 9에 8, 7, 6, 5, 4, 3, 2, 1을 곱한 9!입니다. 이렇게 앞에서부터 숫자를 하나씩 정할 때마다 가능한 순열의 가짓수는 팩토리얼에서 수를 하나씩 낮춘 값과 같습니다.
파이썬에서 팩토리얼은 math 모듈의 팩토리얼(factorial) 함수를 가져와 나타냅니다. 예를 들어 9!은 factorial(9)로 나타내죠.
2. 가능한 경우의 수를 고려해 100만 번째 순열 찾기
이제 팩토리얼 값을 이용해 100만 번째 순열을 찾습니다. 예를 들어 0으로 시작하는 순열은 36만 2880(=9!)개입니다. 1 또는 2로 시작하는 순열 역시 각각 36만 2880가지로 같죠. 첫 자리가 0 또는 1인 순열의 가짓수는 총 75만 2760(=36만2880×2)가지이고, 첫 자리가 0 또는 1, 2인 순열의 가짓수는 총 108만 8640(=36만2880×3)가지입니다. 따라서 100만 번째 순열은 이 사이에 있어야 하므로 2로 시작한다는 걸 예상할 수 있죠. 이렇게 자릿수를 구하는 방식은 아래와 같은 코드로 나타냅니다.
➊➋➌➍ math 모듈을 실행해 팩토리얼 함수를 불러온 뒤, 100만 번째 순열의 맨 앞자리 수를 구하는 코드를 실행합니다. 결과로 몫은 2, 나머지는 27만 4239가 나오므로 첫 번째 자릿수는 0번째 항부터 시작하는 리스트의 규칙에 따라 2번째 항인 2입니다.
➎➏➐ 100만 번째 수열의 맨 앞 자릿수가 2이므로 리스트에서 2를 지우고, 앞서 구한 나머지인 27만 4239를 8!로 나눈 몫과 나머지를 구합니다. 몫은 6이므로 리스트에서 6번째 항인 7이 100만 번째 수열의 두 번째 자릿수입니다.
➑➒➓ 두 번째 자릿수인 7을 리스트에서 지우고, 앞서 구한 나머지 3만 2319를 7!로 나눈 몫과 나머지를 구합니다. 몫은 6이므로 리스트에서 6번째 항인 8이 세 번째 자릿수입니다. 나머지가 0이 나올 때까지 반복해 100만 번째 수열을 구합니다.
드디어! 수학자들과 농구 게임을 할 수 있게 됐네요. 피타고라스부터 나이가 많은 순서대로 0~9번까지 등번호를 주고, 오일러 프로젝트 24번 문제의 답에 따라 팀을 나눴더니 라이프니츠, 갈루아, 푸앵카레, 라그랑주, 힐베르트 순서대로 A팀, B팀은 유클리드, 뫼비우스, 가우스, 아벨, 피타고라스 순으로 한 팀이 됐어요. 자, 이대로 농구 경기를 한다면 어느 팀이 이길까요?