Leetcode [Math] 67. Add Binary [Easy]
in CodingTest
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
andb
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 연산한 결과값을 문자열로 출력합니다.
- 문제 풀이
- indexPointer를 이용하여 뒤에서부터 바이너리 연산을 수행합니다.
- upper변수를 두어 숫자올림에 대한 판단을 하게 하였습니다.
- 첫번째 반복문을 통과한 후, a,b 중에 아직 계산하지 않은 바이너리가 있을 경우, 그에대한 계산을 수행합니다.
- 최종적으로 입력된 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문을 개선했습니다. 값을 먼저 가져와서 바이너리 연산은 한곳에서 진행하고, 반올림을 해야하는지에 대한 판단도 한번만 해도 되도록 짜여있습니다.
- 저는 코드를 읽히는 대로 작성해서 통과한 날것의 코드인데, 개선코드들을 공부해가면서 처음 접근시에도 좀 더 좋은 접근법으로 짤 수 있도록 노력해야 겠다고 생각이 드네요.