728x90
난이도 - 브론즈 2
문제
두 개의 이진수를 입력받아 이를 더하는 프로그램을 작성하시오.
입력
첫째 줄에 두 개의 이진수가 빈 칸을 사이에 두고 주어진다. 각 이진수는 1 또는 0으로만 이루어져 있으며, 0으로 시작할 수도 있다. 또한 각 이진수의 길이는 80을 넘지 않는다.
출력
첫째 줄에 이진수 덧셈 결과를 출력한다. 결과가 0인 경우를 제외하고는 출력되는 이진수는 항상 1로 시작해야 한다.
728x90
- 입력받은 2진수의 앞에 있는 모든 '0'을 제거한다.
- 2진수의 길이가 0이 되면 2진수를 '0'으로 설정한다.
- binarySum()
- 두 2진수의 길이를 맞춘다. 더 짧은 2진수의 앞에 부족한만큼 '0'을 채운다.
- 더하기 수행: b1.charAt(i) + b2.charAt(i) + carry (carry는 처음에는 뒤에서 넘어오는 수가 없으므로 0으로 초기화)
- 0 + 0 + 0 => 2진수: 0, carry: 0
- 0 + 1 + 0 => 2진수: 1, carry: 0
- 1 + 1 + 0 => 2진수: 0, carry: 1
- 1 + 1 + 1 => 2진수: 1, carry: 1
- 더하기 연산의 결과를 2로 나눈 나머지 값이 2진수 값이 되고, 2로 나눈 몫이 carry가 된다.
- 2진수 배열의 더하기가 끝나고 carry가 1인 경우 carry도 append한다. 그 결과를 뒤집어 return한다.
import java.io.*;
import java.util.StringTokenizer;
public class Main1252 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
String b1 = st.nextToken().replaceAll("^0+", "");
String b2 = st.nextToken().replaceAll("^0+", "");
if (b1.length() == 0)
b1 = "0";
if (b2.length() == 0)
b2 = "0";
String result = binarySum(b1, b2);
bw.write(result);
bw.flush();
br.close();
bw.close();
}
static String binarySum(String b1, String b2) {
StringBuffer result = new StringBuffer();
int maxLength = Math.max(b1.length(), b2.length());
b1 = String.format("%" + maxLength + "s", b1).replace(' ', '0');
b2 = String.format("%" + maxLength + "s", b2).replace(' ', '0');
int carry = 0;
for (int i = maxLength - 1; i >= 0; i--) {
int sum = (b1.charAt(i) - '0') + (b2.charAt(i) - '0') + carry;
result.append(sum % 2);
carry = sum / 2;
}
if (carry == 1)
result.append(carry);
return result.reverse().toString();
}
}
String b1 = st.nextToken().replaceAll("^0+", "");
- 정규표현식 '^0+'을 사용하여 앞의 0을 모두 제거한다.
- ^: 패턴이 문자열의 시작 부분에서만 일치하도록 한다.
- +: 앞의 패턴(0)이 하나 이상 연속적으로 나타나는 것을 의미한다.
String.format("%" + maxLength + "s", b1).replace(' ', '0');
- String.format은 특정 형식으로 문자열을 포맷하는 데 사용된다.
- maxLength가 N이면, "%Ns"로 해석되며 이는 문자열의 최소 너비를 지정한다. 문자열의 길이가 N보다 짧으면 공백 문자로 채운다.
- 공백 문자를 '0'으로 교체하여 결과적으로 짧은 2진수 앞에 0이 추가된다.
728x90
'백준 > Java' 카테고리의 다른 글
[백준 자바] 12813번(이진수 연산) - and, or, xor, not (0) | 2024.06.20 |
---|---|
[백준 자바] 2729번(이진수 덧셈) (0) | 2024.06.20 |
[백준 자바] 2226번(이진수) (0) | 2024.06.20 |
[백준 자바] 1550번(16진수) - 16진수를 10진수로 바꾸기 (0) | 2024.06.19 |
[백준 자바] 3460번(이진수) - '1' 위치 찾기 (0) | 2024.06.19 |