본문 바로가기
자바과정/파이썬

파이썬 정수 1000000까지 2진수, 10진수가 같은 회문의 정수 구하기

by Parkej 2021. 10. 7.

제목을 좀 난해하게 적었는데 설명하자면 이렇다.

 

101 같이 뒤집어도 같은 숫자가 존재한다 131, 212... 등등 

 

한자리 정수는 말할것도 없고 입력받은 정수까지의 회문이 가능한 수를 구하는건데 조건이 2진수를 포함한것 까지이다.

그러면 if문에는 and를 사용해 2진수랑 10진수의 회문이 같은 정수를 구하자 라고 인지할 수 있다.

 

뭐.. 10진수까지는 어찌저찌해서 금방 코드를 짤 수 있겠지만 2진수는 조금 난해했다. 자바로 했을때는 라이브러리를 사용하지않고 직접 '/', '%'를 써서 배열에 저장하는 식으로 구현했던 기억이 있다. 

 

하지만 파이썬은 그렇지 않다. 역시나 대단한 언어이다.

 

물론 다른 분들의 코드를 참고해서 작성했다. 

 

비교해야할 것은 먼저 반복문안에 모든 숫자를 비교해야 하는데 1부터 1000000까지이다. 

  for i in range(1,1000001):

 - 파이썬 for 문의 range 특징 : 최대값의 -1까지만 돈다. 그래서 +1을 더한다.

 

그리고 해당 숫자를 뒤집어줄 변수를 만든다. (2진수랑 10진수의 회문을 담을 공간)

    reverse_num = str(i)[::-1] # 10진수 뒤집기
    bin_num = str(bin(i)[2::][::-1]) # 2진수 뒤집기

 - [::-1] 의 의미는 해당 값을 거꾸로 시작해 입력해준다는 의미이다. 100이라는 값에 100[::-1]을 하면 001처럼 거꾸로 출력된다고 보면 된다.

 - 그래서 결국 reverse_num 에는 str(100)[::-1]이라는 값이 들어오게 되면 함수 동작으로 인해 001이라는 값이 저장되게 된다. 

 - bin()이라는 함수는 파이썬에서 2진수로 변환시켜주는 함수이다. str(bin(11)) 이라는 값을 테스트하면 0b1011이라는 2진수로 변환되어 저장된다. 하지만 0b는 우리가 사용할 것이 아니기에 [2::]를 통해 앞의 2글자만 슬라이싱해준다. 

 - 결국 str(bin(11)[2::])는 1011이라는 값이 저장되고 뒤에 [::-1]을 붙여주면 1011이 거꾸로 된 1101이 저장된다. 

 - 이제 이값들을 가지고 비교문을 만든다. 

    if reverse_num == str(i) and bin_num == str(bin(i)[2:]): # 10진수, 2진수 뒤집기 비교
      print(str(i))

 - 보다시피 reverse_num 과 bin_num에는 뒤집어진 값들이 들어가 있다. 우리는 이것이 뒤집기 전 값과 일치한지 확인하는 작업을 진행해야 한다. 그리고 and 연산자를 써서 10진수와 2진수의 회문이 같은 정수가 맞는지 판별하는 것이다. 

 - True(참)의 결과가 나오면 print로 해당 정수가 출력이 되는 구조다. 

 

# 전체코드 

def test_same(n):
  for i in range(1,n+1):
    reverse_num = str(i)[::-1] # 10진수 뒤집기
    bin_num = str(bin(i)[2::][::-1]) # 2진수 뒤집기
    if reverse_num == str(i) and bin_num == str(bin(i)[2:]): # 10진수, 2진수 뒤집기 비교
      print(str(i))
  
test_same(1000000)

 

# Result

 

값은 이렇게 나와버렸다. 손수 계산한 결과 맞다 ㅋ(힘들다)

반응형

댓글