나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

Algorithm

[Euler] Highly divisible triangular number

devidea 2016. 3. 25. 09:36

python 공부를 할 때, 실제로 코딩을 하면서 공부하는 방법이 익숙해 지는데 빨라서 간단한 알고리즘을 풀기로 했다.

그래서 활용한 방법이 http://projecteuler.net에서 수학 관련 알고리즘 문제를 푸는 것이었다.


첫번째로 풀 문제는

Problem 12. Highly divisible triangular number


간단히 설명하면 아래와 같이 연속적인 숫자들의 합으로 구해진 triangle number 중에서 처음으로 소수의 개수가 500개가 넘는 수를 구하는 문제이다.


1 + 2 + 3 + 4 + 5 + 6 + 7 = 28 (연속적인 숫자의 합)

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... (triangle number)


triangle number에 대한 소수를 나열하면 아래와 같다. 이때, 소수의 수가 500개가 넘는 첫 triangle number는 무엇일까가 문제이다.

 1: 1
 3: 1,3
 6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28



python으로 구현한 알고리즘 해답이다.

def divisors_count(triangle_num):
    factors = set([1, triangle_num])
    for i in range(2, triangle_num):
        if i in factors:
            return factors
        if triangle_num % 2 != 0:
            break
        elif triangle_num % i == 0:
            factors.add(i)
            factors.add(triangle_num / i)
    return factors


def triangle_number(n):
    return sum([i for i in range(1, n + 1)])


if __name__ == "__main__":

    success = False
    j = 0
    n = 0
    while not success:
        j += 1
        n = triangle_number(j)

        if len(divisors_count(n)) > 500:
            success = True
    print(n)


반응형

'Algorithm' 카테고리의 다른 글

AVL Tree (2) - 삭제  (0) 2017.08.25
AVL Tree (1) - 개념, 삽입  (0) 2017.08.24
[algospot] 조세푸스 문제 (연결리스트)  (0) 2017.08.03
[분할정복] 카라츠바 알고리즘  (0) 2014.06.21
분할정복  (0) 2014.04.04