십진법의 숫자와 이진법으로 변환한 숫자 양쪽 모두 대칭(Palindrome)인 숫자를 찾는 문제입니다.
예를 들면, 십진수 585 는 이진수로 변환하면 1001001001 이고, 십진수와 이진수 양쪽 모두 대칭인 Palindrome 숫자입니다.
이런 성질을 만족하는 수를 백만까지 모두 찾아서 더하는것이 문제입니다.
대칭검사
대칭검사(palindrome)은 4번 문제에서 사용했었습니다.
string = 'test'
if string == string[::-1]:
print('palindrome')
else:
print('not palindrome')
not palindrome
[::-1] 구문은 문자열 slice 기능인데, 마지막에 -1값을 주게 되면 문자열이 거꾸로 뒤집힙니다. 뒤집어서 같으면 palindrome이겠죠.
10진수 palindrome
for i in range(1,1000):
if i == int(str(i)[::-1]):
print(i)
1 2 3 4 5 ... 959 969 979 989 999
2진수 변환
for i in range(1,100):
binary = str(bin(i))
print(binary)
0b1 0b10 0b11 0b100 0b101 0b110 ...
변환하면 앞쪽에 2진수를 표시하는 0b 라는 문자열이 붙어있습니다. 적당히 잘라내고, 나머지 부분만 취해줍니다.
for i in range(1,100):
binary = str(bin(i))[2:]
print(binary)
01 10 11 100 101 110 111 ...
2진 Palindrome
# 2진 palindrome
for i in range(1,100):
binary = str(bin(i))[2:]
if binary == binary[::-1]:
print(i,binary)
1 1 3 11 5 101 7 111 9 1001 15 1111 17 10001 21 10101 27 11011 31 11111 33 100001 ...
10진수와 2진수 동시에 Palindrome
for i in range(1,100):
binary = str(bin(i))[2:]
if i == int(str(i)[::-1]) and binary == binary[::-1]:
print(i,binary)
1 1 3 11 5 101 7 111 9 1001 33 100001 99 1100011
100만까지 누적
total=0
for i in range(1,1000000):
binary = str(bin(i))[2:]
if i == int(str(i)[::-1]) and binary == binary[::-1]:
total+=i
print(total)

