십진법의 숫자와 이진법으로 변환한 숫자 양쪽 모두 대칭(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)