Algorithm/LeetCode

LeetCode 67(Add Binary, Python)

펩시_콜라 2023. 11. 9. 19:00

1. 문제 링크

2. 문제 설명

  • 이진법으로 구성된 두개의 문자열 a,b가 주어졌을 때, 두 개의 합을 이진법으로 반환
  • 예시) a= "11", b= "1"이면 십진법으로 3+1= 4이고, 이를 다시 이진법으로 반환한 "100"을 반환 

3. 처음 풀이 

  • 만약 두 문자열이 0이면 0을 반환,
  • 두 문자열을 더한 값을 십진법으로 반환하고 → 다시 이진법으로 변환하는 식으로 풀이
    • "11"과 "1"을 더한 "12"를 십진법으로 변환하면, 2*1 + 1*2^1 = 4
    • 4를 계속 2로 나누면서 이진법으로 변환 
      • result = '' (sum_num = 4)
      • result = '0' (sum_num = 2)
      • result = '00' (sum_num = 1)
      • result = '100' (sum_num = 0) while문 종료
class Solution:
    def addBinary(self, a: str, b: str) -> str:
        
        if a =='0' and b=='0': # 두 문자열이 '0'이면 '0'을 반환
            return '0'
                
        digits = len(str(int(a) + int(b))) - 1 # 두 문자열의 합의 자리수 -1 을 계산 
        sum_num = 0
        
        for i in str(int(a) + int(b)): # 십진법으로 변환한 값을 sum_num에 저장
            sum_num += int(i) * 2 ** digits 
            digits -= 1 
        
        result = ''
        while(sum_num != 0): # 이진법으로 다시 변환 - sum_num이 0이 아닐 때까지 계속 2로 나누면서 result를 concat
            result = str(sum_num % 2) + result
            sum_num = sum_num // 2 

        return result
  • runtime beats 93.96% 

4. 다른 풀이 

  • 문자열 a,b에 대해 각각십진법으로 변환한 후 → 다시 이진법으로 변환 (본질은 기존 풀이와 같다)
class Solution:
    def addBinary(self, a: str, b: str) -> str:
        a_ten=0
        b_ten=0
        c_bin=''

        for i in a:
            a_ten=2*a_ten+int(i)

        for i in b:
            b_ten=2*b_ten+int(i)

        c_ten=a_ten+b_ten

        if c_ten==0:
            return '0'

        while c_ten>=1:
            c_bin=str(c_ten%2)+c_bin
            c_ten=c_ten//2
        
        return c_bin

5. 배운 점 

  • 이진법 ↔ 십진법 변환 방법만 잘 알면 직관적으로 해결 가능한 문제