2017년 5월 12일 금요일

Project Euler - 004(Largest palindrome product)

Project Euler - 004(Largest palindrome product)

사이트

문제

영문
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.
한글
앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(palindrome)라고 부릅니다.
두 자리 수를 곱해 만들 수 있는 대칭수 중 가장 큰 수는 9009 (= 91 × 99) 입니다.
세 자리 수를 곱해 만들 수 있는 가장 큰 대칭수는 얼마입니까?

풀이과정

이번 문제는 좀 어려웠다.
대칭수를 구하는 부분에서 어떻게 해야하나 많은 고민을 했다.
처음에는 리스트를 이용해 역순정렬을 하려고 했지만, 문자열을 바로 역순으로 보여주는 문법이 있어 이를 응용했다.
(자세한 자료는 아래 참고사이트에서 확인)

내가 푼 답안

# 대칭수를 찾기 위한 함수 
def palindrome(num):
    # 넘어온 굿자를 문자열화 시킨다.(숫자는 안되기 때문...) 
    num_str = str(num)
    #print("구하고자 하는 수 : ", num_str) 
    # 대칭수인지 아닌지 판별을 위해 문자를 뒤집는다. 
    num_str_reverse = num_str[::-1]
    #print("문자를 뒤집는다. : ", num_str_reverse) 
    if num_str==num_str_reverse:
        #print("%d 는 대칭수 입니다." %num) 
        return True
    else:
        #print("%d 는 대칭수가 아닙니다." %num) 
        return False
# palindrome(9009) 
def main(n1, n2):
    lst = [0, 0, 0]
    for x in range(1n1+1):
        for y in range(1n2+1):
            num = x * y
            if palindrome(num)==True and lst[0] < num:
                lst[0] = num
                lst[1] = x
                lst[2] = y
    return lst
print("두자리 수의 곱 중 가장 큰 대칭 수 구하기")
num = main(9999)
print("대칭수 : %d\n1번수 : %d\n2번수 : %d" % (num[0]num[1]num[2]))
print("===" * 50)
print("세자리 수의 곱 중 가장 큰 대칭 수 구하기")
num = main(999999)
print("대칭수 : %d\n1번수 : %d\n2번수 : %d" % (num[0]num[1]num[2]))

참고사이트

#Project_Euler #question4 #프로젝트_오일러 #python3 #Largest_palindrome_product #palindrome #StackOverflow #reverse #Extended_Slices

댓글 없음:

댓글 쓰기