Project Euler. #4. Largest palindrome product

By | 2013/02/14

Project Euler (http://projecteuler.net/) 문제4

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.

회문 숫자는 양방향 어느쪽에서 읽어도 같다. 두 자리 숫자의 곱으로 이루어지는 숫자 중 가장 큰 회문 숫자는 9009 = 91 * 99 이다.

세 자리 숫자의 곱으로 이루어진 숫자 중 가장 큰 회문 문자를 찾아라.


def isPalindrome(a, b):
p = str(a*b)
i = len(p)
j = 0
while j<=i: if p[j]!=p[i-1]: return False i-=1 j+=1 return True m = 0 for a in range(999,100,-1): for b in range(999,100,-1): if isPalindrome(a, b): if m < (a*b): m = (a*b) print m [/python] 세자리 숫자라면 100부터 999까지의 숫자가 있다. 그래서 중첩 for 문을 이용해서 세자리 숫자의 곱으로 이루어질 수 있는 모든 수를 검사한다. 이렇게 찾아진 회문 숫자 중 가장 큰 숫자를 찾아내는 방법으로 이 문제를 해결하였다. 다른 사람들이 해결한 방법을 보면 정말 딱 세자리 숫자의 곱만 풀 수 있도록 a[0]==a[-1], a[1]==a[-2], 이런 식으로 비교용 인덱스를 고정해버린 사람이 많았다. 나는 세자리의 곱이든 네자리의 곱이든 숫자 길이에 상관없이 회문 숫자 여부를 확인할 수 있도록 len()을 이용해서 p[j]!=p[i-1], 이런 식으로 유동적으로 짰으니 좀 더 말랑말랑하달까... 중첩 for문의 숫자만 바꾸면 몇 자리 수의 곱으로 된 수이든 상관없이 가장 큰 회문 숫자를 찾아낼 수 있다. 자, 여기서 또 시작된 장난질, 코드 골프!


def isPalindrome(a, b):
p = str(a*b)
i = len(p)
j = 0
while j<=i: if p[j]!=p[i-1]: return False i-=1 j+=1 return True print max([a*b for a in range(999,100,-1) for b in range(999,100,-1) if isPalindrome(a, b)]) [/python] 리스트 내장을 이용해서 여러줄을 줄일 수 있다. isPalindrome 함수도 좀 더 간단한 방법으로 표현 가능할 것 같은데, 어떻게 더 쉬운 방법이 있을지 모르겠다.