Dazzling 개발 노트

[백준] 2729 - 이진수 덧셈 (Java) 본문

Algorithm/백준

[백준] 2729 - 이진수 덧셈 (Java)

dj._.dazzling 2023. 10. 18. 11:04

[백준] 2729 - 이진수 덧셈 (Java)

문제

https://www.acmicpc.net/problem/2729

풀이/후기

이진수가 나올 때마다 어떻게 풀어야할지 감이 안잡힌다,,

십진수로 변환하여 풀면 쉬울 것 같은데,

이런 문제는 대부분 엄청 큰 수까지 나오기 때문에 그렇게 접근할 수는 없다,,

 

그리고 덧셈의 경우, 뒷자리 부터 비교를 하는데

그럼 결과가 역순이 된다.

StringBuilder를 평소에 자주 사용하는 편인데

이 문제 덕분에 reverse()로 역순으로 출력이 가능한 것을 알게 되었다.

 

추가적으로 문제에서 요구하는 출력 조건이 까다로운데,

예외적 테스트케이스로

000 000 으로 주어졌을때 결과는 000이 아니라 0으로 출력되어야 한다.

즉 0이 문자열의 앞에서 겹쳐지는 경우를 고려해야 한다.

코드

package Implementation;

import java.io.*;
import java.util.*;

public class Problem2729 {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());


        while (T-- > 0 ){
            StringBuilder sb = new StringBuilder();
            StringTokenizer str = new StringTokenizer(br.readLine());
            String A = str.nextToken();
            String B = str.nextToken();

            int len = 0;        //더 큰 문자열의 길이
            int diff = 0;       //두 문자열의 크기 차이
            int carry = 0;      //반올림 처리
            int remain = 0;     

            if (A.length() > B.length()){
                len = A.length();
                diff = A.length() - B.length();
                while (diff-- > 0){
                    B = '0' + B;
                }
                //System.out.println("B "+B);
            } else if(A.length() < B.length()){
                len = B.length();
                diff = B.length() - A.length();
                while (diff-- > 0 ){
                    A = '0' + A;
                }
                //System.out.println("A "+A);
            } else {
                len = A.length();
            }

            for (int i=len-1; i>=0; i--){
                int sum = (A.charAt(i) - '0') + (B.charAt(i) - '0') + carry;

                carry = sum / 2;
                remain = sum % 2;

                //System.out.printf("sum=%d carry=%d remain=%d \n", sum, carry, remain);

                sb.append(remain);

                //반올림 처리
                if (i == 0 && carry == 1){
                    sb.append(1);
                }
            }
            
            //결과에 000과 같은 경우가 담기면 처리
            char[] arr = sb.reverse().toString().toCharArray();
            int cnt = 0;
            for (int i=0; i<arr.length; i++){
                if (arr[i] == '0'){
                    cnt++;
                }
                else break;
            }

            if (cnt == arr.length){
                System.out.println(0);
            } else {
                //결과가 0으로 시작할 수 있으니 cnt부터 시작
                for (int i=cnt; i<arr.length; i++){
                    System.out.print(arr[i]);
                }
                System.out.println();
            }

        }

        
    }
}

Commit

https://github.com/allrightDJ0108/CodingTestStudy/commit/5aab3ae01c143ccbbaf2c75d12f1bde332293f0d

참고

https://hyeyun.tistory.com/entry/%EB%B0%B1%EC%A4%80-BOJ-2729-%EC%9D%B4%EC%A7%84%EC%88%98-%EB%8D%A7%EC%85%88-%EC%9E%90%EB%B0%94-JAVA