반응형
Problem 4
앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(palindrome)라고 부릅니다.
두 자리 수를 곱해 만들 수 있는 대칭수 중 가장 큰 수는 9009 (= 91 × 99) 입니다.
세 자리 수를 곱해 만들 수 있는 가장 큰 대칭수는 얼마입니까?
처음 아이디어
- 세 자리 수끼리의 곱의 범위는 (10000, 999999)로 5자리 또는 6자리이다.
- 대칭수 중 가장 큰 숫자를 묻고 있으므로, 6자리일 확률이 높다.(물론 아닐 수도 있다.)
- 따라서 큰 수부터 먼저 곱하고 작은 수는 나중에 곱한다.
- 그 다음, 숫자를 문자열로 변환하여 앞 3자리 숫자를 거꾸로 했을 때, 뒤 3자리 숫자와 같도록 조건문을 작성한다.
- 6자리 수에서 대칭수가 없을 경우를 대비하여 5자리의 경우의 조건문도 넣는다.
result = []
for i in range(999,100,-1):
for j in range(999,100,-1):
num = str(i*j)
if len(num) == 6:
a, b, c, d, e, f = num[0], num[1], num[2], num[3], num[4], num[5]
if a==f and b==e and c==d:
result.append(int(num))
elif len(result) == 0:
a, b, c, d, e = num[0], num[1], num[2], num[3], num[4]
if a==e and b==d:
result.append(int(num))
print(max(result))
결과 :
906609
큰 수부터 안 곱하고, 차례대로 곱했을 경우
result = []
for i in range(100,999):
for j in range(100,999):
num = str(i*j)
if len(num) == 6:
a, b, c, d, e, f = num[0], num[1], num[2], num[3], num[4], num[5]
if a==f and b==e and c==d:
result.append(int(num))
else:
a, b, c, d, e = num[0], num[1], num[2], num[3], num[4]
if a==e and b==d:
result.append(int(num))
print(max(result))
결과 :
906609
다른 아이디어
-
숫자가 대칭인 것을 쉽게 판별할 수 있는 식 발견
if str(num) == str(num)[::-1]: 사용
-
위 조건을 만족하는 숫자를 리스트에 넣고, 그 중 제일 큰 값이 정답!
result = []
for i in range(100,1000):
for j in range(100,1000):
num = i*j
if str(num) == str(num)[::-1]:
result.append(num)
print(max(result))
결과 :
906609
반응형
'알고리즘 문제 & 프로그래밍 > 파이썬' 카테고리의 다른 글
[백준 2884번] 알람시계 문제 | 파이썬 if문 (0) | 2020.06.13 |
---|---|
[프로젝트 오일러] 5번 문제 & 풀이 (1 ~ 20 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수) (0) | 2020.05.30 |
[프로젝트 오일러] 3번 문제 & 풀이 (가장 큰 소인수 구하기) (0) | 2020.05.18 |
오일러 프로젝트 2번 (0) | 2018.12.08 |
오일러 프로젝트 1번 (0) | 2018.12.08 |
댓글