코딩 연습

프로젝트 오일러 124번 본문

project euler with python

프로젝트 오일러 124번

코딩아저씨 2016. 3. 15. 15:56
반응형

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 1n10, 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 1n100000, find E(10000).




rad(n) 은 자연수 n 의 소인수들의 곱을 나타낸다. 예를 들어, 504=23×32×7 로 소인수분해 되기 때문에 rad(504)=2×3×7=42. 가 된다.

1n10 에 대해서 rad(n) 을 구하고, rad(n) 에 대해서 오름차순으로 정리한 후, rad(n) 값이 같은 것들에 대해서는 다시 n 에 대해서 오름차순으로 정리하면 위 표와 같은 결과를 얻는다.

E(k) 가 오름차순으로 정리된 상태에서 k 번째 해당하는 n 값을 나타낸다고 하자. 예를 들어, E(4)=8 이고 E(6)=9 이다. 1n100000 에 대해서 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


Comments