문제로

내가 푼 것

틀림

정답

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
    public String addBinary(String a, String b) {
        StringBuilder result = new StringBuilder();
        int i = a.length() - 1;
        int j = b.length() - 1;
        int carry = 0;

        while (i >= 0 || j >= 0) {
            int digitA = (i >= 0) ? a.charAt(i) - '0' : 0;
            int digitB = (j >= 0) ? b.charAt(j) - '0' : 0;
            int sum = digitA + digitB + carry;

            result.append(sum % 2);
            carry = sum / 2;

            i--;
            j--;
        }

        if (carry != 0) {
            result.append(carry);
        }

        return result.reverse().toString();
    }
}

참고

1
2
int digitA = (i >= 0) ? a.charAt(i) - '0' : 0;
int digitB = (j >= 0) ? b.charAt(j) - '0' : 0;
  • a.charAt(i)와 b.charAt(j)는 char 타입의 값을 반환합니다. 이는 문자열의 특정 위치에 있는 문자입니다.
  • ‘0’는 또한 char 타입입니다. 하지만, 자바에서 char 타입은 실제로는 정수 값(유니코드 값)을 가지며, ‘0’의 유니코드 값은 48입니다.
  • 따라서, a.charAt(i) - ‘0’는 char 타입 값에서 char 타입 값 ‘0’을 빼는 연산을 수행합니다. 이 때, 자바는 자동으로 char 타입을 int 타입으로 변환하여 빼기 연산을 수행합니다.
  • 예를 들어, a.charAt(i)가 ‘1’이면, 이는 유니코드 값 49를 가집니다. 따라서 49 - 48은 1이 되어, 결국 digitA는 1이 됩니다.
  • 결과적으로, a.charAt(i) - ‘0’는 문자 ‘0’에서 ‘9’ 사이의 문자를 해당하는 정수 값 0에서 9로 변환합니다. 이는 자동 형변환을 통해 이루어집니다.
1
2
result.append(sum % 2);
carry = sum / 2;
  • sum은 int 타입이며, 2는 리터럴 정수 타입입니다.
  • % 연산자와 / 연산자는 int 타입끼리의 연산을 수행하며, 결과도 int 타입입니다.
  • 이 과정에서 특별한 형변환은 일어나지 않지만, 연산의 결과가 int 타입으로 유지됩니다.