Hello, Freakin world!

[백준 10757번][Java] 큰 수 A+B - 구현 본문

알고리즘/PS

[백준 10757번][Java] 큰 수 A+B - 구현

johnna_endure 2020. 11. 7. 00:29

https://www.acmicpc.net/problem/10757

 

10757번: 큰 수 A+B

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

www.acmicpc.net

 

풀이 방법

 

1. 먼저 두 수 중 가장 긴 자릿수에 맞춰서 짧은 수 앞에 0을 붙입니다.

2. 맨 뒤에서부터 덧셈하는 하는데 합이 10 이상일 경우에 다음 자릿수 합에서 1을 더해줍니다.

 

 

아래 코드에서 주목할 만한 포인트

- 아래 구현에서 calculate(a,b)에서 항상 a <= b가 성립하도록 값을 넘겨주고 있음

- 다음 자릿수들의 합에 더해줘야 하는 값(adder)을 10으로 나눈 몫으로 구현

- 현재 자리 값은 sum % 10으로 구현

- 마지막 자리에서는 그냥 더한 값을 그대로 추가해주면 된다.(자릿수를 맞춰줬기 때문에 편하게 구현 가능)

 

 

import java.io.*;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

/*
큰 수 A+B
https://www.acmicpc.net/problem/10757
 */
public class Main {
    public static void main(String[] args) throws IOException {
//        InputReader reader = new InputReader("testcase.txt");
        InputReader reader = new InputReader();
        StringTokenizer st = new StringTokenizer(reader.readLine());
        String a = st.nextToken();
        String b = st.nextToken();

        if(a.length() > b.length()) {
            String temp = a;
            a = b;
            b = temp;
        }
        System.out.println(calculate(a,b));
    }
    /*
    항상 b의 길이가 a보다 항상 크거나 같다
     */
    private static String calculate(String a, String b) {
        ArrayDeque<Integer> q = new ArrayDeque<>();

        a = fillZero(a, b.length());

        int index = a.length()-1;
        int adder = 0;
        while(index >= 0) {
            int ia = chatToInt(a.charAt(index));
            int ib = chatToInt(b.charAt(index));
            int sum = ia+ib+adder;
            if(index == 0) {
                q.addFirst(sum); break;
            }
            adder = sum/10;
            q.addFirst(sum%10);
            index--;
        }
        return toString(q);
    }

    private static String fillZero(String a, int max) {
        int a_length = a.length();
        for (int i = 0; i < max-a_length; i++) {
            a = '0'+a;
        }
        return a;
    }

    public static String toString(ArrayDeque<Integer> q) {
        StringBuilder sb = new StringBuilder();
        for (int n : q) {
            sb.append(n);
        }
        return sb.toString();
    }

    private static int chatToInt(char c) {
        return c-48;
    }


}
class InputReader {
    private BufferedReader br;

    public InputReader() {
        br = new BufferedReader(new InputStreamReader(System.in));
    }

    public InputReader(String filepath) {
        try {
            br = new BufferedReader(new FileReader(filepath));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public List<Character> readLineIntoCharList() throws IOException {
        List<Character> l = new ArrayList<>();
        while(true) {
            int readVal = br.read();
            if(readVal == '\n' || readVal == -1) break;
            l.add((char)readVal);
        }
        return l;
    }

    public boolean ready() throws IOException {
        return br.ready();
    }

    public String readLine() throws IOException {
        return br.readLine();
    }
    public int readInt() throws IOException {
        return Integer.parseInt(readLine());
    }
    public Long readLong() throws IOException {
        return Long.parseLong(readLine());
    }
}
Comments