티스토리 뷰
문제를 살펴봅시다.
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
- 취미
- 대학
- 알고리즘
- 코딩연습
- 프로그래밍
- 물리
- 군대
- MATLAB
- 정수론
- repunit
- 대학생활
- 피타고라스
- 미적분
- 공대
- 컴공
- 복학
- 공부
- 코딩
- 사망년
- pell's equation
- coding
- 수학
- Problem Solving
- 대수경
- projecteuler
- 텝스
- 선형대수학
- 복학생
- project euler
- 회상
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |