CodingTest/프로젝트 오일러

[파이썬]프로젝트 오일러 #4

Daybreak21 2022. 9. 18. 18:42
앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(palindrome)라고 부릅니다.

두 자리 수를 곱해 만들 수 있는 대칭수 중 가장 큰 수는 9009 (= 91 × 99) 입니다.

세 자리 수를 곱해 만들 수 있는 가장 큰 대칭수는 얼마입니까?

 

a = []

for i in range(1, 1000):
    for j in range(1, 1000):
        num = i * j
        if num >= 100000:
            if  (int(str(num)[0])== int(str(num)[5])) and (int(str(num)[1])== int(str(num)[4])) and (int(str(num)[2])== int(str(num)[3])):
                a.append(num)

    

print(max(a))

1학기때 코딩도장 문제푼다고 적은 코드 

가장큰수가 여섯자리에서 나온다고 가정하고 썼다. 

그래서 이번에는 몇자리 수가 나오더라도 대칭수를 판별할 수 있는 알고리즘을 만들어보자 라고 생각하고 문제를 다시 풀었다.

 

 

num의 길이를 사용해서 구할려고 하다가 막혀서 구글링을 하다가 이런 한줄 코드를 보았다... [::-1]를 사용해  num를 뒤집고 비교하는 방법으로 코드를 고쳤다. 

print(max([x*y for x in range(100, 1000) for y in range(100, 1000) if str(x*y) == str(x*y)[::-1]]))

 

result = 0
for i in range(100, 1000):
    for j in range(100, 1000):

        num = i * j
        reverse = str(num)[::-1]
        if str(num) == reverse:
            result = num



print(result)

오답코드.. 

맨 마지막에 저장되는 수가 제일 큰수겠거니라고 생각하고 풀었다. 하지만 마지막에 저장된 result값에서 j가 제일 클때 i는 첫번째 반복문을 돌릴때 나온 수일 수도 있는 것이다. 그래서 배열에 값을 저장하고 max값을 꺼내는 방법으로 바꾸었다. 

 

result = []
for i in range(100, 1000):
    for j in range(100, 1000):

        num = i * j
        reverse = str(num)[::-1]
        if str(num) == reverse:
            result.append(num)

print(max(result))

찐찐찐찐막코드 

답: 906609