사이트 이름 - 문제 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])
'프로그래밍 > 알고리즘' 카테고리의 다른 글
소수 구하기 (0) | 2021.01.25 |
---|---|
1 ~ 20 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수 (0) | 2021.01.25 |
가장 큰 소인수 구하기 (0) | 2021.01.23 |
피보나치 수열에서 4백만 이하이면서 짝수인 항의 합 (0) | 2021.01.22 |
1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면? (0) | 2021.01.21 |