[백준] 1252번: 이진수 덧셈

응갱·2022년 7월 10일
1

백준

목록 보기
7/56
post-thumbnail

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

문제

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

입력

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

출력

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

코드

import java.util.Scanner;

public class pr1252 {

	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		
		String a= s.next();
		String b= s.next();
		
		int length=0;
		if(a.length()>=b.length())
			length=a.length()+1;
		else
			length=b.length()+1;

		char[] arr_a=new char[length];
		char[] arr_b=new char[length];
		
		// 자릿수맞추기
		if(a.length()>=b.length()) {
			for(int i=0;i<(length-b.length());i++)
				arr_b[i]='0';
			arr_a[0]='0';
		}
		//자릿수맞추기
		if(a.length()<b.length()) {
			for(int i=0;i<(length-a.length());i++)
				arr_a[i]='0';
			arr_b[0]='0';
		}
		
		for(int i=0;i<a.length();i++) {
			arr_a[length-i-1]=a.charAt(a.length()-i-1);
		}
		

		for(int i=0;i<b.length();i++) {
			arr_b[length-i-1]=b.charAt(b.length()-i-1);
		}
		
		int carry=0;
		char[] arr = new char[length];	// 덧셈 결과 저장할 배열
		//덧셈
		for(int i=0;i<length;i++) {
			if(carry==1) {
				if(arr_a[length-i-1]!=arr_b[length-i-1]) {
					arr[length-i-1]='0';
					carry=1;
				}
				else {
					if(arr_a[length-i-1]=='0') {
						arr[length-i-1]='1';
						carry=0;
					}
					if(arr_a[length-i-1]=='1') {
						arr[length-i-1]='1';
						carry=1;
					}
				}
			}
			else {
				if(arr_a[length-i-1]!=arr_b[length-i-1]) {
					arr[length-i-1]='1';
					carry=0;
				}
				else {
					if(arr_a[length-i-1]=='0') {
						arr[length-i-1]='0';
						carry=0;
					}
					if(arr_a[length-i-1]=='1') {
						arr[length-i-1]='0';
						carry=1;
					}
				}
			}
			
		}
		//자릿수가 커지는 경우
		if(arr[0]=='\u0000') {
			if(carry==1)
				arr[0]='1';
			else
				arr[0]='0';
			
		}
		//출력 배열 앞 0 제거하고 출력하기
		int cnt=0;
		for(int i=0;i<length;i++) {
			if(arr[i]=='0')
				cnt++;
			else break;
		}
		char[] answer=new char[length-cnt];
		if(cnt==length)
			System.out.println('0');
		else
			for(int i=0;i<answer.length;i++) {
				answer[i]=arr[i+cnt];
				System.out.print(answer[i]);
			}
				
	}

}

코드 해석

이진수의 덧셈 과정을 그대로 코드로 나타내었다.

  1. 입력된 두 이진수 중 길이가 더 긴 이진수의 길이 +1 만큼을 두 이진수를 저장할 배열의 길이로 설정하였다. (예를 들어 1111과 111 이 입력될 경우 계산 결과 자릿수가 5가 되기때문이다.)

  2. 이진수의 덧셈 과정에서 자릿수를 맞추기 위해 길이가 짧은 이진수의 앞에 0을 붙여주도록 하였다.

  3. 그리고, 이진수의 덧셈은 carry의 유무로 계산의 결과가 바뀌기 때문에 if문으로 덧셈 과정을 나타내었다.

  4. 출력 조건에서 '결과가 0인 경우를 제외하고는 출력되는 이진수는 항상 1로 시작해야 한다.'라는 조건이 있기 때문에 계산 결과 앞에 0이 있는 경우 0을 제외하고 결과를 출력하도록 하였다.

🥔감자의 과정🥔

입력 조건 중 '각 이진수가 0으로 시작할 수 있다.' 와 출력 조건 중 '결과가 0인 경우를 제외하고는 출력되는 이진수는 항상 1로 시작해야 한다.'가 코드를 작성하는 과정에서 난해했다.
그리고, 이진수의 자릿수가 증가하는 경우가 100과 100이 입력된 경우처럼 자릿수가 같고 가장 왼쪽 수가 1인 경우라고 착각하였었다.

문제를 다 풀고 다른 사람들이 푼 코드들을 찾아보니 BigInteger를 이용하면 간단하게 이진수 덧셈 결과를 나타낼 수 있었다 , ,

profile
🥔 한 덩이

0개의 댓글