[그림 01] Problem 004 문제


문제를 살펴보면 다음과 같습니다.

문제 이름 : 가장 큰 데칼코마니 숫자

문제 내용 : Palindromic 숫자란 앞으로 읽나 뒤로 읽나 같은 숫자를 의미합니다. 두 자리 숫자 두 개로 만들어진 가장 큰 Palindromic 숫자는 9009 = 91 x 99입니다. 그렇다면 세 자리 숫자 두 개로 이루어진 Palindromic 숫자 중 가장 큰 숫자를 찾으십시오.

※ palindrome 이란 앞에서부터 읽나 뒤에서부터 읽나 똑같은 것을 의미함(madam, nurse run 과 같은 것)


우리는 다음과 같은 조건을 가진다는 것을 알 수 있습니다.

1. 3자리 숫자 두 개를 곱해서 생성된 숫자를 Palindromic 숫자인지 구분해야 함

2. 범위는 999 * 999의 가지 수를 가짐


이제 소스코드를 작성해보도록 합시다.

뭔가 발코드인 느낌도 나고... 아니면 괜히 복잡하게 작성한 것 같을 수 있습니다.


def judgePalindromic(palinNum):
	palinNumList = list(str(palinNum))#palindromic 숫자를 확인하기 위한 숫자 구분
	palinNumLen  = len(palinNumList)  #palindromic 숫자의 길이
	
	for i in range(int(palinNumLen / 2)):
		#palindromic 숫자의 맨 앞과 맨 끝의 숫자를 비교함(길이가 홀수/짝수 상관 없음)
		if palinNumList[i] != palinNumList[-(i+1)]:
			return 0
	return palinNum
	
if __name__ == "__main__":
	Main_PalindromicNumber = 0
	Main_Digits = [999, 999]     #999 * 999의 가지 수
	Main_LimitRange = 0          #999 ~ LimitRange를 정해줌
	
	#Main_Digits[0] x Main_Digits[1]의 곱을 이중 for문으로 작성
	for i in range(Main_Digits[0], Main_LimitRange, -1):
		for j in range(Main_Digits[1], Main_LimitRange, -1):
			num = i * j
			
			#Palindromic숫자고, 이전의 Palindromic숫자보다 크면 Main_PalindromicNumber에 저장함
			if judgePalindromic(num) and Main_PalindromicNumber < num:
				Main_PalindromicNumber = num
	
	print(Main_PalindromicNumber)


judgePalindromic(숫자) 함수는 Palindromic 숫자임을 확인해주는 함수입니다.

main함수에서는 세 자리 숫자의 두 개를 곱하여 Palindromic 숫자임을 확인하는 이중 for문을 작성하였고, if를 통해 (0이 아닌 값이 반환) and (이전의 숫자보다 크면 Main_PalindromicNumber에 저장)합니다.

이 모든 것들이 완료되면 출력하게 됩니다.


저보다 잘하는 사람은 겁나 많습니다.

사실 이쯤되면 조금 분하기도 합니다. 저는 겁나 길게 작성했는데 이 소스는 겁나 짧네요.

출처 : http://www.s-anand.net/euler.html

n = 0
for a in range(999, 100, -1):
    for b in range(a, 100, -1):
        x = a * b
        if x > n:
            s = str(a * b)
            if s == s[::-1]:
                n = a * b
print(n)

맞다.... 그랬습니다. string값을 뒤집어서 그 값이랑 기존의 값이랑 비교하면 되는 것이었습니다.

굉장하다 이 소스...!!!

저는 바보같이 그것을 일일이 비교하였습니다.

s == s[::-1]은 기존의 string == 반대로 string입니다.


+ Recent posts