(프로그래머스 77885) 2개 이하로 다른 비트

ps  · 4 mins read

이해

  • 양의 정수 x가 주어질 때, x보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수를 return하라.
  • 예를 들어, x = 2일 때 2보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수는 3이 된다.
    • 2: 000…0010
    • 3: 000…0011

계획

  • 입력받은 숫자를 2진수로 변환한 후 최하위 비트부터 올라가서 처음으로 0이 나오는 위치를 찾은 후에 1로 바뀌주고 바로 오른쪽 위치에 비트가 존재한다면 0으로 바꿔주어 비트가 다른 지점이 2개 이하인 제일 작은 수를 구해준다.
  • 모든 비트가 1인 경우에는 처음으로 0이 나오는 위치를 찾을 수가 없기 때문에 위치를 탐색하기 전에 최상위 비트에 0을 넣어준다.
  • for문을 사용하여 문자열로 표현된 이진수의 최하위 비트부터 탐색하면서 처음으로 0이 나오는 위치를 찾아준다.

실행

def dec_to_bin(num):
    temp = ""
    while num > 0:
        temp = str(num % 2) + temp
        num //= 2
    return temp


def bin_to_dec(s):  
    dec_num = 0
    rev_s = s[::-1]
    for i in range(len(s)):
        dec_num += int(rev_s[i])*(2**i)
        
    return dec_num


def solution(numbers):
    result = []
    
    for num in numbers:
        bin_num = list('0' + dec_to_bin(num))
        for i in range(len(bin_num) - 1, -1, -1):
            if bin_num[i] == '0':
                bin_num[i] = '1'
                if i != len(bin_num) - 1:
                    bin_num[i+1] = '0'
                break
        result.append(bin_to_dec("".join(bin_num)))
    return result

개선

  • 십진수를 이진수로 변환할 때 비트 값을 문자가 아닌 숫자로 다뤄주면 str, int함수를 사용하지 않고 간단히 구현할 수 있다.
def dec_to_bin(num):
    temp = []
    while num > 0:
        temp.append(num % 2)
        num //= 2
    return temp[::-1]


def bin_to_dec(bin_num):  
    dec_num = 0
    for i in range(len(bin_num)):
        dec_num += bin_num[len(bin_num)-i-1]*(2**i)
        
    return dec_num


def solution(numbers):
    result = []
    
    for num in numbers:
        bin_num = [0] + dec_to_bin(num)
        for i in range(len(bin_num) - 1, -1, -1):
            if bin_num[i] == 0:
                bin_num[i] = 1
                if i != len(bin_num) - 1:
                    bin_num[i+1] = 0
                break
        result.append(bin_to_dec(bin_num))
    return result
  • dec_to_bin, bin_to_dec 함수를 정의하지 않고, bin, int 내장함수를 사용하여 간단하게 구현이 가능하다.
    def solution(numbers):
      result = []
        
      for num in numbers:
          bin_num = list('0' + bin(num)[2:])
          for i in range(len(bin_num) - 1, -1, -1):
              if bin_num[i] == '0':
                  bin_num[i] = '1'
                  if i != len(bin_num) - 1:
                      bin_num[i+1] = '0'
                  break
          result.append(int("".join(bin_num), 2))
      return result
    

    회고

  • bin, int 내장함수를 사용하면 더 간단하게 구현이 가능하다는 것을 알고 있었는데 내장함수의 인자 값과 반환 값 형태가 잘 기억이 나지 않아서 직접 함수를 정의해서 구현하였다. bin, oct, hex 내장함수를 꼭 기억해놔야겠다.