Dazzling 개발 노트
[백준] 2729 - 이진수 덧셈 (Java) 본문
[백준] 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
참고