티어 : Bronze 2
정답여부 : 오답
알고리즘 유형 :수학, 구현, 사칙연산
시간 제한 : 2초
💡문제
두 개의 이진수를 입력받아 이를 더하는 프로그램을 작성하시오.
💡입력
첫째 줄에 두 개의 이진수가 빈 칸을 사이에 두고 주어진다. 각 이진수는 1 또는 0으로만 이루어져 있으며, 0으로 시작할 수도 있다. 또한 각 이진수의 길이는 80을 넘지 않는다.
💡출력
첫째 줄에 이진수 덧셈 결과를 출력한다. 결과가 0인 경우를 제외하고는 출력되는 이진수는 항상 1로 시작해야 한다.
💡예제 입력1
1001101 10010
💡예제 출력1
1011111
💡문제 분석
- 해당 이진수들의 합을 구하면 되는 문제
💡알고리즘 설계
- 이진수를 String으로 받아와서 다시 Int로 정수로 바꿔준 다음 십진수로 바꿔줌
- 둘이 더한 십진수를 다시 이진수로 바꿔줌
💡시간복잡도
- O(N)
💡코드
import java.util.*;
import java.io.*;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String N = st.nextToken();
String M = st.nextToken();
// 이진수 문자열을 정수로 변환
BigInteger nValue = new BigInteger(N, 2);
BigInteger mValue = new BigInteger(M, 2);
// 두 정수의 합을 계산
BigInteger sum = nValue.add(mValue);
// 결과를 이진수 문자열로 출력
System.out.println(sum.toString());
}
}
💡 틀린 이유
정수형 타입을 int로 받아주면 안된다.
2진수는 80자리까지 가능하다고 한다. 그렇단건 10진수로 바꾸면 2의 80제곱이 넘어선다는 것이다. 그렇다면 long형인 2읜 63제곱을 넘어선다. 그렇기에 BigInteger를 사용하자.
💡 틀린 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String A = st.nextToken();
String B = st.nextToken();
//BigInteger 형변환 하면서 10진수로 바꿔준다.(A, 2)가 10진수로 바꾸는 방법
BigInteger A_binary = new BigInteger(A, 2);
BigInteger B_binary = new BigInteger(B, 2);
//합 연산식(add)로 더해서 변수에 저장.
BigInteger sum = A_binary.add(B_binary);
//풀이방식에 적어둔 대로 2진수로 변환
String sum_binary = sum.toString(2);
System.out.println(sum_binary);
}
}
💡 느낀점 or 기억할정보
해당 문제에 문제를 잘 읽어야한다.이진수로 변하는 알고리즘은 처음이라 신기하다.