프로그래머스/Lv. 0(코딩테스트 입문)

[프로그래머스 코딩테스트] 이진수 더하기(Java)

Sigfriede 2023. 4. 9. 19:22

  문제 설명

  이진수를 의미하는 두 개의 문자열 bin1과 bin2가 매개변수로 주어질 때, 두 이진수의 합을 return 하도록 solution 함수를 완성해주세요.

 

  제한사항

  • return 값은 이진수를 의미하는 문자열입니다.
  • 1 <= bin1, bin2의 길이 <= 10
  • bin1과 bin2는 0과 1로만 이루어져 있습니다.
  • bin1과 bin2는 "0"을  제외하고 0으로 시작하지 않습니다.

 

  입출력 예

bin1 bin2 result
"10" "11" "101"
"1001" "1111" "11000"
class Solution {
    public String solution(String bin1, String bin2) {
        int a = Integer.parseInt(bin1, 2);
        int b = Integer.parseInt(bin2, 2);
        int sum = a + b;
        
        String answer = Integer.toBinaryString(sum);
        return answer;
    }
}

  문자열인 bin1과 bin2를 Integer 클래스의 parseInt를 통해 이진수로 변환해줍니다. 이를 더한 뒤, 다시 Integer 클래스의 toBinaryString 메소드를 통해 answer에 할당해줍니다.

 

class Solution {
    public String solution(String bin1, String bin2) {
        int a = Integer.parseInt(bin1, 2);
        int b = Integer.parseInt(bin2, 2);
        
        while (b != 0) {
            int carry = a & b;
            a = a ^ b;
            b = carry << 1;
        }
        String answer = Integer.toBinaryString(a);
        return answer;
    }
}

  멋있게 비트 연산자로 계산하고 싶었습니다. 계산 과정은 아래와 같습니다.

 

  1. 각 자리별로 XOR(^) 연산을 수행합니다(이때, 자리올림을 고려하지 않습니다).
  2. 각 자리별로 AND(&) 연산을 수행합니다(이때 자리올림을 확인하는 데에 씁니다).
  3. 자리올림 값을 왼쪽으로 1비트씩 이동시켜 계산합니다. 시프트 연산(<<)을 사용합니다.
  4. 1번과 3번에서 수행한 결과를 (XOR) 연산으로 다시 더합니다.
  5. 자리올림 값이 더는 존재하지 않을 때까지 앞선 과정을 반복합니다.

 

  위의 간단한 식이 이렇게 복잡해지더라구요. 비트 연산자를 사용한 풀이를 보고 싶어서 열심히 찾아봤는데도 없는 이유가 있었습니다. 계산 속도에도 차이가 없었습니다. 참 간편한 세상에 살고 있다는 생각이 들었습니다.