본문 바로가기

프로그래밍/코드분석

[파이썬] 다음 큰 숫자(next big number)

다음큰숫자

문제 (http://tryhelloworld.co.kr/challenge_codes/173)

어떤 수 N(1≤N≤1,000,000) 이 주어졌을 때, N의 다음 큰 숫자는 다음과 같습니다.

  • N의 다음 큰 숫자는 N을 2진수로 바꾸었을 때의 1의 개수와 같은 개수로 이루어진 수입니다.

  • 1번째 조건을 만족하는 숫자들 중 N보다 큰 수 중에서 가장 작은 숫자를 찾아야 합니다.

예를 들어, 78을 2진수로 바꾸면 1001110 이며, 78의 다음 큰 숫자는 83으로 2진수는 1010011 입니다.
N이 주어질 때, N의 다음 큰 숫자를 찾는 nextBigNumber 함수를 완성하세요.

나의 풀이

def nextBigNumber(n):
  '''
  정수형태의 파라미터 값(n)을 받는다.
 
  (1) make_num_to_binary : 이진수값으로 변환해주는 함수
  (2) binary_num_count_one : (1)의 리턴값을 파라미터로 받아 '1'의 개수를 세준다.
 
  '''
    binary_num = make_num_to_binary(n)
    count_one = binary_num_count_one(binary_num)
 
    next_num = n + 1
 
    while True:
      '''
      (1) n보다 1이 큰 숫자를 계속 while문으로 돌려본다.
      (2) next_num의 '1' 개수가 일치하면 종료
      '''
        next_num_binary = make_num_to_binary(next_num) # 이진수값으로 변환 
        next_num_count_one = binary_num_count_one(next_num_binary) # '1'의 개수를 센다. 
 
        if count_one == next_num_count_one:&nbsnbsp;# 일치하면 next_num을 리턴하고 반복문 종료 
            return next_num
 
        next_num += 1
 
 
def make_num_to_binary(n):
    '''
    정수의 숫자를 받아 이진수로 표현한 값을 돌려준다.
    '''
    binary_list = []
    # make_num_to_binary 
    while n != 1:
        binary_list.append(n % 2) # 나머지들을 binary_list에 붙여나간다. 
        n = n // 2
 
    binary_list.append(1)  # 맨 처음은 무조건 1로 시작되어야 하기 때문에 1을 마지막에 강제로 붙인다. 
    binary_list = binary_list[::-1] # 리스트들을 뒤에서부터 출력하게 만든다. 
 
    binary_num = ''.join(str(n) for n in binary_list)  # '1001110' 형태로 변환 
 
    # 참고로 join은 리스트 타입을 문자열로 만들어준다. 
    # 문자열로 join해야하기 때문에 n을 str 타입으로 변환했다. 
 
    return binary_num
 
 
def binary_num_count_one(binary_num):
    '''
    str 형태의 binary_num을 받아서, 1의 개수를 돌려준다.
    '''
    one = "1"
 
    count_one = binary_num.count(one)  # 1의 개수를 세서 저장 
    return count_one  # 1의 개수를 돌려준다 
 
 
# 아래 코드는 테스트를 위한 출력 코드입니다. 
print(nextBigNumber(78))
 

발생했던 오류

  1. int object is not callable

  2. TypeError sequece item 0: expected str instance, int found

    join 메서드는 리스트를 문자열로 변환해주는 함수인데, 각 원소들을 이어붙이고자 한다면 str타입으롭 변환해야 한다.

다른 사람의 풀이

def nextBigNumber(n):
    c = bin(n).count('1')
    for m in range(n+1,1000001):
        if bin(m).count('1') == c:
            return m

새롭게 배운 것

bin(n) 함수는 정수(integer)를 binary string으로 변환해준다.

>>> print(bin(78))
0b1001110