새소식

알고리즘/문제풀이

백준 - 11382번 꼬마정민

  • -

해설


기본적인 연산 문제입니다.

 

기존에는 int를 사용해서 연산해왔지만, 입력 값의 범위를 보면 int가 수용할 수 있는 크기를 넘어서기 때문에 long 타입으로 변경하여 계산해주면 됩니다.

 

문제 자체는 어렵지 않기 때문에 만약 Long범위를 초과하는 경우에 대해서 생각해보려고 합니다.

 

Long범위를 초과하는 경우엔 BigDecimal이나 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());

        // 만약, Long 범위를 초과하는 경우
        String A = st.nextToken();
        String B = st.nextToken();
        String C = st.nextToken();

        // 계산한 결과를 저장할 배열
        char[] answer = new char[Math.max(A.length(),Math.max(B.length(),C.length())) + 1];

        // A,B,C의 길이가 다 다르기 때문에 1의 자리수부터 따라가기 위한 변수 선언
        int aIdx = A.length() - 1;
        int bIdx = B.length() - 1;
        int cIdx = C.length() - 1;

        // 각 자리의 합이 10을 넘기는 경우 다음 자리로 넘겨줘야하는 수
        int next = 0;
        
        // answer 배열의 인덱스를 따라갈 수
        int idx = answer.length - 1;
        while (aIdx > -1 || bIdx > -1 || cIdx > -1) {
            int a = aIdx >= 0 ? A.charAt(aIdx) - '0' : 0;
            int b = bIdx >= 0 ? B.charAt(bIdx) - '0' : 0;
            int c = cIdx >= 0 ? C.charAt(cIdx) - '0' : 0;

            int sum = a + b + c + next;

            next = sum / 10;
            answer[idx--] = (char) (sum % 10 + '0');

            aIdx--;
            bIdx--;
            cIdx--;
        }

        if (next != 0) {
            answer[idx--] = (char) (next + '0');
        }

        StringBuilder sb = new StringBuilder();
        for (int i = idx + 1; i < answer.length; i++) {
            sb.append(answer[i]);
        }

        System.out.println(sb);
    }
}
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.