세자리 수를 곱해 만들 수 있는 가장 큰 대칭수

사이트 이름 - 문제 4번

앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(palindrome)라고 부릅니다. 두 자리 수를 곱해 만들 수 있는 대칭수 중 가장 큰 수는 9009 (= 91 × 99) 입니다. 세 자리 수를 곱해 만들 수 있는 가장 큰 대칭수는 얼마입니까?

해결방법

먼저 대칭수를 찾는 알고리즘부터 생각해야겠다.

위키백과에서 대칭수를 찾아보면

대칭수(對稱數, 영어: palindromic number) 또는 회문수(回文數)는 순서대로 읽은 수와 거꾸로 읽은 수가 같은 수를 말한다. 예를 들어 34543은 대칭수이고, 34567은 대칭수가 아니다. 처음 30개의 대칭수(십진법)는 다음과 같다.

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202 (OEIS의 수열 A002113)

공식도 나와있는데 뭔 말인지 모르겠다.😂 수학을 안한지 너무 오래됐나...쩝

하루 종일 고민을 했다. 그러다 어느 순간 갑자기 아래 코드가 떠올랐다.

def is_palindrome(number):
    '''
    대칭이 되기 때문에 문자열로 변경 후
    원래 문자와 비교해서 같다면 대칭수이다.
    '''
    string = str(number)

    if string == string[::-1]:
        return True
    else:
        return False

위 내용을 찾았으니 역순으로 곱해본다.

가장 큰 수이기 때문에 아무래도 큰 수와 곱했을 때 큰 수가 나올 것이다.

maximum = 0
for i in range(999, 99, -1):
    for j in range(999, 99, -1):
        number = i * j
        
        '''
        대칭수이고 maximum 이라면 출력한다.
        언제 maximum이 나올런지 모르기 때문에 전체적으로 출력을 해 본다.
        '''
        if is_palindrome(number) and maximum < number:
            maximum = number
            print(f'{i} x {j} = {number}', maximum)

'''
출력 결과

995 x 583 = 580085 580085
993 x 913 = 906609 906609

가장 큰 수는 906609 이고, 993 x 913 을 곱했을때 나온다.
'''

다른이의 답변

print([i*j for i in range(999,900,-1) for j in range(999,900,-1) if str(i*j) == str(i*j)[::-1]][0])

+ Recent posts