알고리즘_PS/Project Euler

[Project_Euler] 55번 10000 미만의 라이크렐 수 세기

hanseongjun 2022. 3. 18. 11:53
728x90
반응형

코드

def palidrome(k):       # 대칭수 찾는 함수, O(logn)
    k = str(k)
    length = len(k)
    for i in range(length//2):
        if k[i] != k[length - i - 1]:
            return 0
    return 1

n = 1
lychrel = 0         # 라이크렐 수의 개수
while n <= 10000:   # 10000까지 반복
    cnt = 0         # 대칭수 되는지 체크
    standard_n = n  # 더하는 두 n 중 첫번째 n, 대칭되는 n은 reversed_n
    for i in range(50):
        reversed_n = int(''.join(reversed(str(standard_n))))
        sum_n = standard_n + reversed_n
        if palidrome(sum_n):
            cnt += 1    # 대칭수가 된다면 break
            #print(sum_n)
            break
        else:
            standard_n = sum_n
    if cnt == 0:    # 50번동안 대칭수가 하나도 없다면
        lychrel += 1
    n += 1
print(lychrel)

이것보다 간단하게 코드를 만들 수 있다.

def lychrel(n):
    for i in range(50):
        n += int(str(n)[::-1])
        if str(n) == str(n)[::-1]:
            return 0
    return 1

cnt = 0
for _ in range(10000):
    if lychrel(_+1):
        cnt += 1
print(cnt)

문자열에서 슬라이싱을 사용하면 굉장히 간단하게 코드를 만들 수 있다.
또한 추상화 과정에서 어떻게 하면 코드를 짤 지를 생각하는 과정도 필요하다.

728x90
반응형
LIST