티스토리 뷰

문제를 살펴봅시다.

The number, 1406357289, is a 0 to 9 pandigital number because it is made up of each of the digits 0 to 9 in some order, but it also has a rather interesting sub-string divisibility property.

Let d1 be the 1st digit, d2 be the 2nd digit, and so on. In this way, we note the following:

  • d2d3d4=406 is divisible by 2
  • d3d4d5=063 is divisible by 3
  • d4d5d6=635 is divisible by 5
  • d5d6d7=357 is divisible by 7
  • d6d7d8=572 is divisible by 11
  • d7d8d9=728 is divisible by 13
  • d8d9d10=289 is divisible by 17

Find the sum of all 0 to 9 pandigital numbers with this property.

0부터 9까지 모든 숫자가 한번씩 쓰이는 열자리 수가 있습니다. 첫째자리 숫자를 d_1이라 하고 그다음부터 d_2, d_3..... d_10이라 명합니다. 그리고 위에서 보시다시피 연속된 7개의 소수에 의해 차례대로 나눠진답니다. 이런 조건을 만족하는 Pandigital numbers의 sum을 구하는게 문제의 목표가 되겠습니다.

처음엔 노가다, 즉 brutal force로 풀려고 했습니다. 무식하게 팬디지털수를 다 구해서 (아마 9*9!개를 다 구하겠다는 의지!) 조건에 만족하는 수를 뽑아내서 더하는게 첫번째 생각이었는데, 코드로 구현해내기 귀찮아서 기각.

그 다음에 든 생각은-이 문제를 푼 아이디어인데- 일단 맨 뒤에 올, 조건에 만족하는 세 자리를 구합니다. 즉 1)서로 숫자가 안겹치고, 2)1000이하의 17의 배수를 구했습니다. 그 세자리 수들을 대상으로 리스트를 만들었습니다.

그렇게 만든 세자리수들 앞에 조건에 알맞는 숫자 d_7를 추가했습니다: 만들어진 세자리 중에 안겹치면서, 추가를 해주면 13의 배수를 만들어 줄 수 있는 숫자를 말이죠. 그렇게 네자리 수가 만들어집니다. 그리고 향후 d_6, d_5...들을 결정할 때도1)아직 안쓰인 숫자 중에서 2)차례에 맞는 소수에 의해 나눠지게 해주는지를 고려했습니다. 가장 앞자리, 즉 d_1은 아직 안 쓰인 숫자로 결정이 되고, 마지막 앞자리가 0인 경우는 배제했습니다.

여기 파이썬으로 구현한 코드입니다.

좀 기네요... 여하간 10ms에서 30ms 정도 걸립니다. 

'Project Euler' 카테고리의 다른 글

progress  (0) 2016.05.29
project euler #120: Square Remainders  (0) 2016.05.28
Project Euler #347: Largest integer divisible by two primes  (0) 2016.05.22
Prob 44: Pentagon Numbers  (0) 2016.05.15
Prob 76: Counting Summations  (0) 2016.05.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함