일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- homogeneous linear system
- 배열 섞기
- Big-Oh 예제
- linear dependence
- trivial solution
- itertools
- includepdf
- 재귀함수
- Big Omega
- 코틀린 시작하기
- 페이지 겹칩
- one-to-one
- 빅오메가
- nonhomogeneous linear system
- matrix trnasformations
- nontrivial solution
- 알고리즘 분석의 실례
- matrix fo a linear transformation
- Big-O 예제
- 빅세타
- 랜덤 순서 배열
- python
- 일차변환
- Big-Oh notation
- Big Theta
- 빅오 표기법
- recursive algorithms
- NumPy
- 코틀린 Hello World!
- 이진 탐색
- Today
- Total
코딩 연습
프로젝트 오일러 124번 본문
The radical of n, rad(n), is the product of the distinct prime factors of n. For example, 504=23×32×7, so rad(504)=2×3×7=42.
If we calculate rad(n) for 1≤n≤10, then sort them on rad(n), and sorting on n if the radical values are equal, we get:
Unsorted |
|
Sorted |
|||
n |
rad(n) |
|
n |
rad(n) |
k |
1 |
1 |
1 |
1 |
1 |
|
2 | 2 |
|
2 |
2 |
2 |
3 |
3 |
|
4 |
2 |
3 |
4 |
2 |
|
8 |
2 |
4 |
5 |
5 |
|
3 |
3 |
5 |
6 |
6 |
|
9 |
3 |
6 |
7 |
7 |
|
5 |
5 |
7 |
8 |
2 |
|
6 |
6 |
8 |
9 |
3 |
|
7 |
7 |
9 |
10 |
10 |
|
10 |
10 |
10 |
Let E(k) be the kth element in the sorted n column; for example, E(4)=8 and E(6)=9.
if rad(n) is sorted for 1≤n≤100000, find E(10000).
rad(n) 은 자연수 n 의 소인수들의 곱을 나타낸다. 예를 들어, 504=23×32×7 로 소인수분해 되기 때문에 rad(504)=2×3×7=42. 가 된다.
1≤n≤10 에 대해서 rad(n) 을 구하고, rad(n) 에 대해서 오름차순으로 정리한 후, rad(n) 값이 같은 것들에 대해서는 다시 n 에 대해서 오름차순으로 정리하면 위 표와 같은 결과를 얻는다.
E(k) 가 오름차순으로 정리된 상태에서 k 번째 해당하는 n 값을 나타낸다고 하자. 예를 들어, E(4)=8 이고 E(6)=9 이다. 1≤n≤100000 에 대해서 rad(n) 을 구하고, 위와 같은 방법으로 오름차순으로 정렬하였을 때 E(10000) 의 값을 구하시오.
문제에서 예로 본 것처럼 n=10 까지만 생각해 보도록 하겠다.
먼저 10 이하의 소수들을 준비해야 한다.
prime = [2, 3, 5, 7]
그리고 다음과 같은 리스트를 만든다.
result = [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [1, 9], [1, 10]]
리스트의 요소인 [1, n] 에서 1은 rad(n) 으로 처음 값을 모두 1로 세팅한 것이다.
이제 다음과 같은 파이썬 코드를 보도록 하자.
for i in prime: for j in range(i, 11, i): result[j][0] *= i
코드에서 보듯이 10 이하의 각각의 소수들에 대해서 그 소수의 배수에 대해서는 1로 세팅된 rad(n) 에 그 소수를 곱해주는 형식으로 소인수들의 곱을 구해 나가는 것이다.
예를 들어, 소수 2에 대해서는 result 에 다음과 같은 변화가 생긴다.
[[1, 1], [2, 2], [1, 3], [2, 4], [1, 5], [2, 6], [1, 7], [2, 8], [1, 9], [2, 10]]
결국 2를 소인수로 갖게 되는 모든 n 들의 rad(n) 값들이 업데이트 된 것을 볼 수 있다. 이런식으로 소수 3에 대해서도 같은 과정을 거치면 result 는 다음과 같이 업데이트 된다.
[[1, 1], [2, 2], [3, 3], [2, 4], [1, 5], [6, 6], [1, 7], [2, 8], [3, 9], [2, 10]]
다시 소수 5에 대해서 같은 과정을 거치면
[[1, 1], [2, 2], [3, 3], [2, 4], [5, 5], [6, 6], [1, 7], [2, 8], [3, 9], [10, 10]]
마지막으로 소수 7에 대해서 같은 과정을 거치면
[[1, 1], [2, 2], [3, 3], [2, 4], [5, 5], [6, 6], [7, 7], [2, 8], [3, 9], [10, 10]]
이렇게 해서 최종적인 rad(n) 들을 얻을 수 있는 것이다.
위와 같은 과정을 n=100000 까지 실행한 후, rad(n) 을 기준으로 정렬을 하고, rad(n) 값이 같은 것들에 대해서는 다시 n 에 대해서 정렬하게 되면 쉽게 답을 구해낼 수 있다.
'project euler with python' 카테고리의 다른 글
프로젝트 오일러 126번 (0) | 2016.03.15 |
---|---|
프로젝트 오일러 125번 (0) | 2016.03.15 |
프로젝트 오일러 123번 (0) | 2016.03.15 |
프로젝트 오일러 122번 (0) | 2016.03.15 |
프로젝트 오일러 121번 (0) | 2016.03.15 |