문제 설명
이진수를 의미하는 두 개의 문자열 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. 자리올림 값이 더는 존재하지 않을 때까지 앞선 과정을 반복합니다. |
위의 간단한 식이 이렇게 복잡해지더라구요. 비트 연산자를 사용한 풀이를 보고 싶어서 열심히 찾아봤는데도 없는 이유가 있었습니다. 계산 속도에도 차이가 없었습니다. 참 간편한 세상에 살고 있다는 생각이 들었습니다.
'프로그래머스 > Lv. 0(코딩테스트 입문)' 카테고리의 다른 글
[프로그래머스 코딩테스트] 외계행성의 나이(Java) (0) | 2023.04.10 |
---|---|
[프로그래머스 코딩테스트] 잘라서 배열로 저장하기(Java) (0) | 2023.04.10 |
[프로그래머스 코딩테스트] 2차원으로 만들기(Java) (0) | 2023.04.09 |
[프로그래머스 코딩테스트] 가장 큰 수 찾기(Java) (0) | 2023.04.09 |
[프로그래머스 코딩테스트] 다음에 올 숫자(Java) (0) | 2023.04.02 |