백준/Java

[백준 자바] 1252번(이진수 덧셈) - 정규표현식, String.format()

gamzaggang7 2024. 6. 20. 12:39
728x90

난이도 - 브론즈 2

문제

두 개의 이진수를 입력받아 이를 더하는 프로그램을 작성하시오.

입력

첫째 줄에 두 개의 이진수가 빈 칸을 사이에 두고 주어진다. 각 이진수는 1 또는 0으로만 이루어져 있으며, 0으로 시작할 수도 있다. 또한 각 이진수의 길이는 80을 넘지 않는다.

출력

첫째 줄에 이진수 덧셈 결과를 출력한다. 결과가 0인 경우를 제외하고는 출력되는 이진수는 항상 1로 시작해야 한다.

 


 

728x90
  1. 입력받은 2진수의 앞에 있는 모든 '0'을 제거한다.
  2. 2진수의 길이가 0이 되면 2진수를 '0'으로 설정한다.
  3. binarySum()
    1. 두 2진수의 길이를 맞춘다. 더 짧은 2진수의 앞에 부족한만큼 '0'을 채운다.
    2. 더하기 수행: 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
    3. 더하기 연산의 결과를 2로 나눈 나머지 값이 2진수 값이 되고, 2로 나눈 몫이 carry가 된다.
    4. 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