21.07.07 기록

1 분 소요

  • 백준 알고리즘 10757 풀이

    • 나의 풀이1(메모리 17.5MB, 시간 248ms로 통과)
      값의 범위가 Long 타입의 범위를 훨씬 넘어서 다른 클래스를 찾아보다가 BigInteger 클래스를 발견했다.
      입력 값을 BigInteger의 인스턴스로 생성한 후, 두 개의 인스턴스 값을 더하여 결과를 출력했다.
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    import java.math.BigInteger;
    
    public class B10757 {
        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());
            System.out.println(A.add(B));
        }
    }
    
    

    📝BigInteger 클래스
     -무한대의 수를 표현할 수 있는 클래스이다.
     -BigInteger 클래스를 생성할 때 BingInteger(String val)를 사용할 수 있다.(JavaDoc 참조)
     -String으로 값을 받기 때문에 사칙연산을 사용할 수 없고, 클래스의 add() 메소드 등을 사용한다.

    • 나의 풀이2(메모리 14.6MB, 시간 136ms로 통과)
      입력값을 문자열로 받은 후 두 수를 각각의 배열로 저장한다.
      처음에 천의 자리 -> 일의 자리 순으로 저장했더니 두 수의 자릿수가 다를 때에는 연산 결과가 이상하게 나왔다.(역순으로 저장하여 해결.)
      각 자리 수를 셈한 결과를 result[] 배열에 저장하고 원래 순서대로 출력한다.
    
     import java.io.BufferedReader;
     import java.io.IOException;
     import java.io.InputStreamReader;
     import java.util.StringTokenizer;
    
     public class B10757 {
         public static void main(String[] args) throws IOException {
             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
             //1. 문자열로 받은 입력값을 분리
             StringTokenizer st = new StringTokenizer(br.readLine(), " ");
             String aStr = st.nextToken();
             String bStr = st.nextToken();
    
             //2. 더 큰 수의 자리수로 배열 길이 설정
             int maxLength = Math.max(aStr.length(), bStr.length());
             int[] A = new int[maxLength];
             int[] B = new int[maxLength];
    
             //3. 입력받은 수의 각 자리수를 배열로 저장 (역순)
             //ex. 4739 2653 -> {9, 3, 7, 4}, {3, 5, 6, 2}
             for(int i = (aStr.length() - 1), j = 0; i >= 0 ; i--, j++) {
                 A[i] = aStr.charAt(j)-48;
             }
             for(int i = (bStr.length() - 1), j = 0; i >= 0 ; i--, j++) {
                 B[i] = bStr.charAt(j)-48;
             }
    
             //4. 각 자리 수 덧셈
             int[] result = new int[maxLength+1];
             for(int i = 0; i < maxLength; i++) {
                 int sum = (A[i] + B[i] + result[i]) ;
                 result[i] = (sum % 10);
                 result[i+1] += (sum / 10);
             }
    
             StringBuilder sb = new StringBuilder();
             if(result[maxLength] != 0) { sb.append(result[maxLength]); }
             for(int i = maxLength-1; i >= 0; i--) {
                 sb.append(result[i]);
             }
    
             System.out.println(sb);
         }
     }
    
    • 해설을 찾아보니 로직이 거의 비슷했다.(코드 생략)

카테고리:

업데이트: