본문 바로가기

문돌이 존버/프로그래밍 스터디

(leetcode 문제 풀이) Add Binary

반응형
Given two binary strings a and b, return their sum as a binary string.
 
Example 1:
Input: a = "11", b = "1"
Output: "100"

Example 2:
Input: a = "1010", b = "1011"
Output: "10101"
 
Constraints:
- 1 <= a.length, b.length <= 10^4
- a and b consist only of '0' or '1' characters.
- Each string does not contain leading zeros except for the zero itself.
class Solution:
    def addBinary(self, a: str, b: str) -> str:
        answer = ''
        # 자릿수 맞추기
        if len(a) != len(b):
            if len(a) > len(b):
                for _ in range(len(a) - len(b)):
                    b = '0' + b
            else:
                for _ in range(len(b) - len(a)):
                    a = '0' + a
                    
        std_len = max(len(a), len(b))
        
        # 맨 뒤의 원소를 먼저 비교해서 높임 여부 확인
        if a[-1] == '1' and b[-1] == '1':
            carry = True
            answer = '0' + answer
        else:
            carry = False
            if a[-1] == '0' and b[-1] == '0':
                answer = '0' + answer
            else: # 둘 중 하나만 1인 경우
                answer = '1' + answer
        
        for i in range(std_len - 2, -1, -1): # 뒤에서 2번째 원소부터 진행
            if a[i] == '1' or b[i] == '1':
                if a[i] == '1' and b[i] == '1':
                    if carry == True:
                        answer = '1' + answer
                    else:
                        answer = '0' + answer
                    carry = True # 항상 True가 되어야 함
                else: # 둘 중 하나만 1일 경우
                    if carry == True:
                        answer = '0' + answer
                    else:
                        answer = '1' + answer
                        
            else: # 둘 다 0일 경우
                if carry == True:
                    answer = '1' + answer
                else:
                    answer = '0' + answer
                carry = False # 항상 False가 되어야 함
        
        # 자릿수 넘어가는 경우 확인
        if carry == True:
            answer = '1' + answer
        
        return answer

문제 자체는 굉장히 간단하다. 이진수끼리 연산을 해서 나온 결과값을 이진수로 리턴하면 된다.

파이썬의 내장 함수를 사용하면 바로 해결될 문제지만, 함수에 의존하지 않고자 직접 논리를 구현하기로 했다. 위의 코드를 보면 단계별로 차근차근 구현해 나간 것을 알 수 있다.

1) 자릿수를 맞추고(짧은 변수에 0을 앞에서부터 추가),
2) 마지막 원소를 먼저 확인해서 높임 여부 확인,
3) 연산 논리 구현

아래는 파이썬 내장 함수인 int(), bin()을 사용한 케이스다. 사실 5줄이면 끝나는 문제지만 처음부터 구현하면 위의 코드처럼 길어짐을 알 수 있다..

# 파이썬 내장 함수 사용
class Solution:
    def addBinary(self, a: str, b: str) -> str:
        a = int(a, 2) # 10진수로 변환
        b = int(b, 2)
        a = a + b
        del b
        return bin(a)[2:] # 2진수로 변환('0b'가 앞에 무조건 붙음)
728x90
반응형