본문 바로가기

파이썬(문제풀이)

파이썬 10진수를 이진수로

더보기

10진수를 2진수로 변환하는 파이썬 코드는 몇 가지 방법이 있다. 가장 흔하고 이해하기 쉬운 방법은 반복문을 사용하는 것이고, 파이썬 내장 함수를 활용하거나 재귀 함수를 이용할 수도 있다.

#1. 반복문을 이용한 방법

가장 기본적인 방법으로, 10진수를 2로 나누는 과정을 반복하고 나머지를 역순으로 이어 붙입니다.

def decimal_to_binary_loop(decimal):
    if decimal == 0:
        return '0'
    
    binary_string = ''
    while decimal > 0:
        remainder = decimal % 2
        binary_string = str(remainder) + binary_string
        decimal //= 2
    return binary_string

# 사용 예시
print(decimal_to_binary_loop(13))  # 출력: 1101
print(decimal_to_binary_loop(255)) # 출력: 11111111

 

코드 분석

  • if decimal == 0:
    • 입력된 10진수가 0일 경우, 2진수도 0이므로 즉시 '0'을 반환합니다. 이는 재귀나 반복문 처리를 시작하기 전에 예외 케이스를 간단하게 처리하는 부분입니다.
  • binary_string = ''
    • 2진수 결과를 저장할 빈 문자열을 초기화합니다. 이 변수에 계산된 2진수의 각 자릿수가 하나씩 추가됩니다.
  • while decimal > 0:
    • 주요 로직이 실행되는 반복문입니다. 10진수 값이 0보다 클 동안 계속해서 반복합니다. 2로 계속 나누다 보면 결국 몫이 0이 되므로, 이 조건은 반복을 멈추는 역할을 합니다.
  • remainder = decimal % 2
    • 10진수를 2로 나눈 나머지를 구합니다. 2진수는 2로 나눈 나머지가 0 또는 1이 되므로, 이 나머지가 2진수의 각 자릿수가 됩니다.
  • binary_string = str(remainder) + binary_string
    • 이 부분이 핵심입니다. 위에서 구한 나머지를 문자열로 변환하고, binary_string의 앞에 붙입니다. 10진수를 2진수로 변환할 때 나머지는 거꾸로 읽어야 올바른 2진수가 되는데, 이 코드는 str(remainder) + binary_string를 통해 나머지를 계속 문자열의 맨 앞에 추가함으로써 자동으로 순서를 뒤집는 효과를 냅니다.
  • decimal //= 2
    • 10진수 값을 2로 나눈 정수 몫으로 업데이트합니다. 이는 다음 반복 단계에서 처리할 새로운 10진수 값이 됩니다.
  • return binary_string
    • 반복문이 종료되면, 최종적으로 완성된 2진수 문자열을 반환합니다.

동작 원리 예시 (입력: 13)

  1. decimal = 13. binary_string = ''.
  2. 반복 1:
    • remainder = 13 % 2 = 1.
    • binary_string = '1' + '' = '1'.
    • decimal = 13 // 2 = 6.
  3. 반복 2:
    • remainder = 6 % 2 = 0.
    • binary_string = '0' + '1' = '01'.
    • decimal = 6 // 2 = 3.
  4. 반복 3:
    • remainder = 3 % 2 = 1.
    • binary_string = '1' + '01' = '101'.
    • decimal = 3 // 2 = 1.
  5. 반복 4:
    • remainder = 1 % 2 = 1.
    • binary_string = '1' + '101' = '1101'.
    • decimal = 1 // 2 = 0.
  6. decimal이 0이 되었으므로 반복문 종료.
  7. 최종 결과 '1101' 반환.

#2. 파이썬 내장 함수 bin() 이용

파이썬에는 10진수를 2진수로 바로 변환해주는 bin() 함수가 있습니다. 이 함수는 결과 앞에 '0b' 접두사를 붙여주는데, 슬라이싱을 이용해 이 접두사를 제거할 수 있습니다.

def decimal_to_binary_bin(decimal):
    return bin(decimal)[2:]

# 사용 예시
print(decimal_to_binary_bin(13))  # 출력: 1101
print(decimal_to_binary_bin(255)) # 출력: 11111111

코드 분석

  • bin(decimal)
    • 이 부분이 함수의 핵심입니다. bin() 함수는 정수(10진수)를 인자로 받아 해당 숫자의 2진수 표현을 문자열로 반환합니다.
    • 예를 들어, bin(13)은 '0b1101'을 반환합니다. 여기서 '0b'는 이 문자열이 2진수임을 나타내는 접두사입니다.
  • [2:]
    • 이것은 파이썬의 슬라이싱(slicing) 문법입니다. 문자열의 인덱스 2번부터 끝까지 잘라낸다는 의미입니다.
    • bin(decimal)이 반환하는 문자열 '0b1101'에서, 인덱스 0은 '0', 인덱스 1은 'b'입니다. 슬라이싱 [2:]는 이 두 문자를 제거하고, 2진수를 나타내는 '1101'만 남깁니다.
  • return bin(decimal)[2:]
    • bin() 함수로 2진수 문자열을 얻고, 이 문자열에서 '0b' 접두사를 제거한 후 최종 결과를 반환합니다.

동작 원리 예시 (입력: 13)

  1. decimal = 13
  2. bin(13)이 호출되어 2진수 문자열 '0b1101'을 반환합니다.
  3. 슬라이싱 [2:]가 '0b1101'에 적용됩니다.
  4. 결과로 '1101'이 남고, 이 값이 반환됩니다.

#3. 재귀 함수를 이용한 방법

함수가 자기 자신을 호출하는 재귀를 사용해 구현할 수도 있습니다.

def decimal_to_binary_recursive(decimal):
    if decimal == 0:
        return ''
    else:
        return decimal_to_binary_recursive(decimal // 2) + str(decimal % 2)

# 사용 예시
print(decimal_to_binary_recursive(13))  # 출력: 1101
print(decimal_to_binary_recursive(255)) # 출력: 11111111

 

더보기

decimal_to_binary_recursive 함수는 재귀(recursion)를 사용해 10진수를 2진수로 변환하는 코드입니다. 재귀는 함수가 자기 자신을 호출하는 프로그래밍 기법으로, 특정 조건이 만족될 때까지 반복적으로 실행되는 특징을 가집니다.


코드 분석

  • if decimal == 0:
    • 이 부분은 재귀의 종료 조건입니다. 10진수를 2로 계속 나누다 보면 결국 몫이 0이 되는 시점이 오는데, 이때 재귀 호출을 멈추고 빈 문자열을 반환합니다. 이 조건이 없으면 함수가 무한히 자신을 호출해 오류가 발생합니다.
  • else:
    • decimal이 0이 아닐 경우, 이 부분이 실행됩니다.
    • return decimal_to_binary_recursive(decimal // 2) + str(decimal % 2)
      • 이 문장은 두 개의 중요한 연산으로 구성됩니다.
      • decimal_to_binary_recursive(decimal // 2): 현재 10진수 값을 2로 나눈 을 가지고 함수 자신을 다시 호출합니다. 이 과정이 반복되면서, 몫이 0이 될 때까지 계속해서 함수가 쌓이게 됩니다.
      • str(decimal % 2): 현재 10진수 값을 2로 나눈 나머지를 문자열로 변환합니다. 2진수는 2로 나눈 나머지가 0 또는 1이므로, 이 값이 2진수의 각 자릿수가 됩니다.

동작 원리 예시 (입력: 13)

재귀 함수는 실행 순서가 거꾸로 진행되므로 스택(stack) 구조와 비슷하게 생각하면 이해하기 쉽습니다.

  1. decimal_to_binary_recursive(13) 호출:
    • decimal_to_binary_recursive(6) 호출 + str(13 % 2) (즉, "1")
  2. decimal_to_binary_recursive(6) 호출:
    • decimal_to_binary_recursive(3) 호출 + str(6 % 2) (즉, "0")
  3. decimal_to_binary_recursive(3) 호출:
    • decimal_to_binary_recursive(1) 호출 + str(3 % 2) (즉, "1")
  4. decimal_to_binary_recursive(1) 호출:
    • decimal_to_binary_recursive(0) 호출 + str(1 % 2) (즉, "1")
  5. decimal_to_binary_recursive(0) 호출:
    • 종료 조건(decimal == 0)에 따라 빈 문자열 ''를 반환하고 재귀가 끝납니다.

이제 반환된 값들이 역순으로 합쳐지기 시작합니다.

  • '' + "1" = "1"
  • "1" + "1" = "11"
  • "11" + "0" = "110"
  • "110" + "1" = "1101"

최종적으로 **"1101"**이 반환됩니다. 이 방법은 나눗셈과 나머지 연산으로 2진수를 구하고, 재귀 호출을 통해 나머지를 역순으로 합치는 효과를 냅니다.


#4. f-string 포맷팅 이용

파이썬의 f-string을 이용해 2진수 포맷으로 변환할 수도 있습니다.

def decimal_to_binary_fstring(decimal):
    return f"{decimal:b}"

# 사용 예시
print(decimal_to_binary_fstring(13))  # 출력: 1101
print(decimal_to_binary_fstring(255)) # 출력: 11111111

코드 분석

  • f"{decimal:b}": 이것은 파이썬의 f-string 포맷팅 문법입니다.
    • f"...": 문자열 앞에 f를 붙여서 f-string을 만듭니다. f-string은 문자열 안에 변수나 표현식을 직접 삽입할 수 있게 해줍니다.
    • {decimal:...}: 중괄호 {} 안에 변수 decimal을 넣습니다.
    • :b: 콜론(:) 뒤에 오는 포맷 지정자입니다. b는 binary를 의미하며, 해당 숫자를 2진수 형식으로 변환하라고 지시합니다.

f"{decimal:b}"는 "변수 decimal의 값을 2진수(binary)로 포맷팅하여 문자열로 만들어라"는 뜻입니다. 이 방법은 내부적으로 효율적인 C 언어 함수를 사용하므로, 반복문이나 재귀 함수보다 빠를 수 있습니다.

동작 원리 예시 (입력: 13)

  1. decimal 변수에 값 13이 할당됩니다.
  2. f"{13:b}" 표현식이 평가됩니다.
  3. 파이썬은 13을 2진수 포맷에 따라 1101이라는 문자열로 변환합니다.
  4. 최종적으로 '1101' 문자열이 반환됩니다.