프로젝트 오일러: 3과 5의 배수들의 합
만약 10이하의 자연수 중 3과 5의 배수를 뽑으라면 3,5,6,9가 되겠다. 이것들의 합은 23이 된다.
그러면 1000이하의 자연수에 대해서 3과 5의 배수들의 합은 얼마가 될까?
풀이 #1
#!/usr/bin/env python3
MAX = 1000
def set_by(n, m):
return set([x for x in range(0, m, n)])
multiple_3 = set_by(3, MAX)
multiple_5 = set_by(5, MAX)
union = multiple_3 | multiple_5
print(sum(union))
n의 배수는 range를 통해서 간단하게 가져올 수 있다. 여기서 3의 배수와 5의 배수 중에서 유니크한 값을 가져와야 하는데, 예를 들어 3과 5의 배수 모두 15라는 값을 가지므로 이는 중복을 제거하여야 하는 것이다. set(집합)을 사용하면 이를 간편하게 처리할 수 있다.
두 배수의 리스트를 set, 집합으로 만든 후 두 집합의 합집합을 |
연산을 통해 얻는다. 그러면 그걸 더하면 끝!
풀이 #2
#!/usr/bin/env python3
MAX=1000
def is_multiple_n(n, d):
return n % d == 0
def is_multiple_3(n):
return is_multiple_n(n, 3)
def is_multiple_5(n):
return is_multiple_n(n, 5)
print(sum([x for x in range(1, MAX) if is_multiple_3(x) or is_multiple_5(x)]))
set을 통해서 풀지 않고 range의 결과를 필터링하는 리스트 표현식으로 풀 수도 있다.