만약 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의 결과를 필터링하는 리스트 표현식으로 풀 수도 있다.