[백준/자바/JAVA] 10757 : 큰수 A+B

Seongkeun·2021년 8월 3일
1

BOJ

목록 보기
7/12
post-thumbnail

[문제]

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

{ 입 출력 예제 }


[문제풀이]

수학적 지식이라기 보다는 프로그래밍적 지식을 묻는 문제이다.

아래는 long 에 대한 유형이름/ 바이트/ 기타이름/ 값의 범위 가 정의되어 있는 표이다.

Integer 형식 중 가장 넓은 값의 범위를 가지는 unsigned long long 의 경우도 이 문제를 풀 수 없다.

그러므로 이 문제는

  • "BigInteger" 객체를 아는지?
  • "배열"로 풀 수 있는지?
  • 문자열 길이에 의한 자릿수 계산 을 할 수 있는지?

를 묻는 문제이다. 3가지 중 한 가지로 접근하면 된다.


[코드작성]

방법 1) BigInteger

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.math.BigInteger;
import java.util.StringTokenizer;

public class Main {
    
	private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); 
	public static void main(String[] args) throws IOException { 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
		StringTokenizer st = new StringTokenizer(br.readLine());
		BigInteger A = new BigInteger(st.nextToken());
        BigInteger B = new BigInteger(st.nextToken());

		bw.write(String.valueOf(A.add(B)));
		bw.flush(); 
		bw.close();
        
    }
}

방법 2) 문자열 자리수 계산

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
 
public class Main {
 
    private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); 
    public static void main(String[] args) throws IOException {
 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        // 예제 입력 ) 6725 15648
        String[] nums = br.readLine().split(" "); 
        
        String A = nums[0];//6725
        String B = nums[1];//15648
 
        int lenA = A.length() - 1; // 3
        int lenB = B.length() - 1; // 4
        
        int count = 0 ; // 자릿수끼리의 계산이 10이 넘어갈때 사용
        
        //계산되는 수를 차곡차곡 담는 그릇
        StringBuilder sb = new StringBuilder();
        
        while(lenA >= 0 || lenB >= 0) {
            // 두 숫자의 자리수가 맞지 않을 경우 
            //ex) 6725 15648 ==> 06725 15648
            int temp1 = 
                 lenA < 0 ? temp1 = 0 : 
                  Character.getNumericValue(A.charAt(lenA)); // 5 2 7 6 0 순서로 뽑힘
                  
            int temp2 = 
                 lenB < 0 ? temp2 = 0 : 
                  Character.getNumericValue(B.charAt(lenB)); // 8 4 6 5 1 순서로 뽑힘
            
            int sum =  temp1+temp2 + count; // 13 7 13 12 2 순서로 계산됨


            sb.insert(0, sum%10);//계속 가장 왼쪽에 숫자를 추가하게 된다.
            
            // 자릿 수 끼리의 계산이 10이 넘어갈때 받는 수
            count = sum/10; // 1 0 1 1 0 
            
            lenA--; // 3 2 1 0 -1
            lenB--; // 4 3 2 1 0
        }
 
        if(count > 0) {
        	sb.insert(0, count);
        }
		bw.write(sb.toString());//22373
		bw.flush(); 
		bw.close();
    }
}

Char 의 특징

문자를 변수에 대입하면, 문자 그대로 저장되는 것이 아니라 그 문자에 해당하는 정수 값(아스키 코드값) 이 저장된다

해결법-1)

// 알아서 int 형으로 변환 됨
A.charAt(lenA)-'0' 

해결법-2)

// wrapper class 중 
// Character에 char형을 int형으로 바꾸는 메소드가 있었다. 
Character.getNumericValue(A.charAt(lenA))

StringBuilder 의 append() 와 insert() 차이

append() : 문자열 데이터 끝에 문자의 형태로 추가
insert() :
첫번째 인자로 삽입될 위치(0이 맨 앞을 의미 문자가 삽입될 위치),
두번째 인자 삽입될 문자

예제)
StringBuilder sb = new StringBuilder("ABCD");
위치 : 0_{0}A1_{1}B2_{2}C3_{3}D4_{4}

예제입력--
sb.insert(2,'z');

예제출력--
ABzCD

profile
지혜는 지식에서 비롯된다

0개의 댓글