본문바로가기
[오일러 프로젝트] 수학 (코딩으로) 싹쓰리: 40755보다 큰 삼각수 중에서 오각수와 육각수도 되는 가장 작은 수는?
수학동아 2020.07.24

 

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

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

 

 

복고 열풍을 타고 MBC 예능프로그램 ‘놀면 뭐하니’에서 새 프로젝트 그룹 ‘싹쓰리’를 선보였습니다.

우리도 가만있을 순 없죠!

리더 마운틴 최를 중심으로 린다Z, 다일러가 모여 일명 ‘수학 싹쓰리’로 뭉쳤습니다.

코딩 문제, 수학으로 싹 다 풀어버려요~!

 

 

<오일러 프로젝트 45번>

40755보다 크면서 삼각수, 오각수, 육각수가 모두 되는 가장 작은 수를 찾으세요.

이때 40755는 285번째 삼각수, 165번째 오각수, 143번째 육각수로

1을 제외하고 삼각수, 오각수, 육각수가 모두 되는 가장 작은 수입니다.

 

 

삼각수와 오각수, 육각수는 각각 삼각형과 오각형, 육각형 형태를 만드는 데 필요한 점의 개수로, 

아래의 공식에 수를 대입해 구할 수 있습니다.

 

 

공식들을 이용해 삼각수와 오각수(p), 육각수(h)가 모두 같은 경우를 찾을 수 있는 식을 만들었습니다. 

(자세한 내용은 수학동아 8월호 오일러 프로젝트 기사를 참고하세요!)

 

p=\frac{1}{6}(\sqrt{48h^2-24h+1}+1)

 

이때 답을 구하기 위해서는 h에 자연수를 대입해 p 역시 자연수인 경우를 찾아야 합니다. p가 자연수가 되려면

1. 제곱근 안의 (48h^2-24h+1)이 제곱수여야 한다.

2. (\sqrt{48h^2-24h+1}+1)을 6으로 나눴을 때 나머지가 5여야 한다.

 

이 두 가지 조건을 만족하는지 알아보는 코드를 만들어 '최산'님이 요청한 문제를 풀어보겠습니다!

 

 

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

 

1. 제곱수인지 확인하는 함수 만들기

p를 구하기 위해서는 \sqrt{48h^2-24h+1}(=\sqrt{n})에 어떤 자연수 h를 대입했을 때, 근호 안이 제곱수인지 알아봐야 합니다. 이때 실수 x에 가장 가까운 정수를 나타내는 int(round(x)) 함수를 사용합니다. 이 함수의 x\sqrt{n}을 넣어 확인하는데 자연수 n이 제곱수가 아니라면 \sqrt{n} 에 가장 가까운 정수는 \sqrt{n}과 같지 않지만, 제곱수라면 같게 나옵니다. 이를 이용해 제곱수인지 아닌지 판별하는 코드를 만듭니다.

 

 

2. 나머지 연산자로 6의 배수인지 확인하는 함수 만들기

(\sqrt{48h^2-24h+1}+1)이 6의 배수여야 하므로, \sqrt{48h^2-24h+1}을 6으로 나눴을 때 나머지가 5여야 합니다. 이 점을 이용해 답을 찾는 조건을 만듭니다.

 

 

 

TIP. 이번 문제의 답을 찾기 위해 풀어야 할 방정식을 각각 ph에 관해 정리하면 두 가지 형태가 나옵니다. 문제를 풀 때는 둘 중 하나만 골라서 사용하면 됩니다.

 

p=\frac{1}{6}(\sqrt{48h^2-24h+1}+1) 또는 h=\frac{1}{4}(\sqrt{12p^2-4p+1}+1)

위의 코드에서는 p에 대해 정리한 식을 이용했지만, h에 대한 식을 쓴다면 (12p^2-4p+1)이 제곱수인지, 또 (\sqrt{12p^2-4p+1}+1)이 4의 배수인지 확인하는 코드를 만들어야겠죠. 따라서 \sqrt{12p^2-4p+1}을 4로 나눈 나머지가 3인지 확인하는 코드 if (int_sqrt(n) % 4 == 3):를 이용합니다.

 

 

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

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

 

 

#1 제곱근을 표현하는 math.sqrt(n) 함수가 저장돼 있는 ‘math 모듈’을 불러옵니다.

#2 int_sqrt(n) 함수를 정의합니다.

#3 p에 대한 식으로 답을 찾는 e045_2() 함수를 만듭니다.

#4 삼각수, 오각수, 육각수 모두 되는 첫 번째 수인 40755가 143번째 육각수이므로, 그보다 큰 수를 찾아야 합니다. 즉 h에 144부터 대입합니다.

#5 while문으로 조건을 만족하는 답을 찾습니다.

#6 (48h^2-24h+1)의 값을 r로 정합니다.

#7 확인해야 할 두 조건을 if문에 넣습니다.

#8 if문의 조건을 만족하는 h가 나오면, 육각수를 구하는 공식에 h를 대입한 값을 저장합니다.

#9 조건을 만족하지 않으면, h에 1을 더한 뒤 while문을 다시 실행합니다.

#10 e045_2() 함수로 찾은 답을 보여줍니다.

 

 

Bonus! 오일러 퀴즈

 

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

 

1. h에 대한 식 h=\frac{1}{4}(\sqrt{12p^2-4p+1}+1)을 이용해 45번 문제의 답을 찾는 코드를 만들어보자.

 

2. 45번 문제의 답과 40755 외에 삼각수, 오각수, 육각수 모두 되는 수를 하나 더 구해보자.

 

 

45번 문제는 앞서 다뤘던 방법뿐 아니라 ph를 점차 늘려가며 정답을 찾을 수도 있습니다.

 

 

이 방식으로 코드를 만들면 간단하지만,

계산에 시간이 더 걸릴 수 있어 방정식 형태로 식을 정리해 '수학적'으로 문제를 해결했죠.

위의 답을 구하는 두 가지의 코드를 직접 실행해보고, 계산 시간에 차이가 있는지 직접 비교해보세요!

 

그럼 다음 오일러 프로젝트 문제에서 만나요~!

 

  •  
    최산 Lv.5 2020.07.24

    int_sqrt 함수 따로 안 만들고 math.isqrt 함수 사용하시면 되요.

    math.isqrt는 int_sqrt와 똑같은 기능을 가진 함수랍니다.

    댓글 작성하기 좋아요0 댓글수0
  • 폴리매스 문제는 2019년도 정부의 재원으로 한국과학창의재단의 지원을 받아 수행된 성과물입니다.

  • ☎문의 02-6749-3911