Leetcode [Math] 67. Add Binary [Easy]

67. Add Binary [Easy]

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 <= 104
  • a and b consist only of '0' or '1' characters.
  • Each string does not contain leading zeros except for the zero itself.

Accepted

1M

Submissions

2M

Acceptance Rate

51.7%


  • 문제 설명

입력되는 문자열 a와 b 를 binary add 연산한 결과값을 문자열로 출력합니다.


  • 문제 풀이
    1. indexPointer를 이용하여 뒤에서부터 바이너리 연산을 수행합니다.
    2. upper변수를 두어 숫자올림에 대한 판단을 하게 하였습니다.
    3. 첫번째 반복문을 통과한 후, a,b 중에 아직 계산하지 않은 바이너리가 있을 경우, 그에대한 계산을 수행합니다.
    4. 최종적으로 입력된 string을 반환합니다.

Swift로 작성한 코드는 아래와 같습니다.

class Solution {
    func addBinary(_ a: String, _ b: String) -> String {
        var aArray = Array(a)
        var bArray = Array(b)

        var aIndex = aArray.count - 1
        var bIndex = bArray.count - 1

        var result = ""
        var upper = false
        while aIndex >= 0  && bIndex >= 0 {
            
            if aArray[aIndex] == "1" && bArray[bIndex] == "1" {
                result.insert(upper ? "1" : "0", at: result.startIndex)
                upper = true
            } else if aArray[aIndex] == "0" && bArray[bIndex] == "0" {
                result.insert(upper ? "1" : "0", at: result.startIndex)
                upper = false
            } else {
                result.insert(upper ? "0" : "1", at: result.startIndex)
            }
            
            aIndex -= 1
            bIndex -= 1
        }

        while aIndex >= 0 {
            if aArray[aIndex] == "1" {
                result.insert(upper ? "0" : "1", at: result.startIndex)
            } else {
                result.insert(upper ? "1" : "0", at: result.startIndex)
                upper = false
            }
            aIndex -= 1
        }
        
        
        while bIndex >= 0 {
            if bArray[bIndex] == "1" {
                result.insert(upper ? "0" : "1", at: result.startIndex)
            } else {
                result.insert(upper ? "1" : "0", at: result.startIndex)
                upper = false
            }
            bIndex -= 1
        }
        
        if upper {
            result.insert("1", at: result.startIndex)
        }
        
        return result
    }
}

다른 사람의 문제 풀이는 더욱 더 간단하게 되어있어 소개합니다.

swifty1 님이 Swift로 작성한 코드는 아래와 같습니다.

class Solution {
    func addBinary(_ a: String, _ b: String) -> String {
        var sum = ""
        var carryOver = 0
        
        var arrA = Array(Array(a).reversed())
        var arrB = Array(Array(b).reversed())

        for i in 0..<max(arrA.count, arrB.count) {                     
            let a = arrA.count > i ? Int("\(arrA[i])")! : 0
            let b = arrB.count > i ? Int("\(arrB[i])")! : 0
            let total = a + b + carryOver
            sum = "\(total % 2)\(sum)"
            carryOver = total / 2
        }
        
        if carryOver == 1 {
            sum = "1" + sum
        }
        
        return sum
    }
}

reversed를 통해 앞에서부터 계산해 나갔으며. for문을 사용하여, 반복적인 while문을 개선했습니다. 값을 먼저 가져와서 바이너리 연산은 한곳에서 진행하고, 반올림을 해야하는지에 대한 판단도 한번만 해도 되도록 짜여있습니다.


  • 저는 코드를 읽히는 대로 작성해서 통과한 날것의 코드인데, 개선코드들을 공부해가면서 처음 접근시에도 좀 더 좋은 접근법으로 짤 수 있도록 노력해야 겠다고 생각이 드네요.