Project Euler #1
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
10미만의 자연수 중 모든 3의 배수와 5의 배수의 합은 23.(3, 5, 6, 9)
1000미만의 자연수 중 모든 3의 배수와 5의 배수의 합은 얼마인가?
func
라는 함수를 구현해서 결과를 출력하도록 했다.
import time
def func(num):
rs = 0
for i in range(1,num):
if i % 3 == 0 or i % 5 == 0:
rs += i
return rs
stime = time.time()
print(func(1000))
print(time.time() - stime)
풀이 1
이 너무 길어 sum()
을 이용하여 한줄로 작성했다.
import time
stime = time.time()
sum(x for x in range(1,1000) if x %3 ==0 or x % 5 == 0)
print(time.time() - stime)
-
문제는
미만의
의 배수 집합(
)과
의 배수의 집합(
)의 합집합(
)의 원소들의 합을 구하는 것이다.
-
집합에서 집합
와 집합
의 합집합은
이다.
-
따라서, (
의 배수의 합)
(
의 배수의 합)
(
의 최소공배수의 합) 이다.
-
최소공배수는 주어진 수를 소인수 분해한 결과 중 소수의 지수가 큰 수들을 곱한 값이다.
-
이 문제에 적용시키면 아래와 같다.
import time
stime = time.time()
sum3 = sum(range(3, 1000, 3))
sum5 = sum(range(5, 1000, 5))
sum15 = sum(range(15, 1000, 15))
sum3 + sum5 - sum15
print(time.time() - stime)
-
풀이 3을 좀 더 진행시키면 다음과 같다.
-
의 합은 다음과 같은 식으로 유도된다.
-
이 문제에 적용시키면 아래와 같다.
import time
nsum = lambda n: n*(n+1)/2
stime = time.time()
q1 = 999 // 3
q2 = 999 // 5
q3 = 999 // 15
3*nsum(q1) + 5*nsum(q2) - 15*nsum(q3)
print(time.time() - stime)
1번 문제라 난도가 낮다.
하지만, 풀이법이 다양하여 Project Euler가 추구하는 방향성을 확실히 보여주는 문제라고 생각한다.
1번 문제일 만하다.
댓글