본문 바로가기

알고리즘/백준알고리즘

[백준알고리즘-JAVA]11720번 풀이(숫자의 합)

안녕하세요

인포돈 입니다.



백준 알고리즘 11720번 풀이입니다. 


* 참고사항
 - 개발환경은 eclipse을 기준으로 작성되었습니다.
 - java언어를 이용하여 문제를 풀이합니다.
 - 알고리즘 문제는 풀이를 보고 해답을 찾는 것도 중요하지만 무엇보다 스스로 풀이를 시도해봐야 합니다!!
(해당 풀이를 보기 전 충분히 문제에 대해 고민해봐야 합니다!)
 - 해당 풀이 말고도 수많은 풀이 방법이 존재합니다


백준 11720 (숫자의 합)

 

문제

N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백 없이 주어진다.

출력

입력으로 주어진 숫자 N개의 합을 출력한다.

입력 예시

1
1

출력 예시

1

입력 예시

11
10987654321

출력 예시

46

실패 코드

 

public class Main {
	public static void main(String args[]) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int va = Integer.parseInt(br.readLine());
		int str = Integer.parseInt(br.readLine());
		int sum = 0;
		
		for(int i = 0 ; i < va ; i++) {
			sum = sum + str%10;
			str = str/10;
		}

		System.out.println(sum);
	}
	
	}

해당 코드는 런타임 오류로 실패를 했다. 해당 문제에서 입력을 자세히 살펴보면 100의 자리까지 담을 수 있는 데이터가 타입이 필요하다는 것을 알 수 있다.

 

아래 보이는 표와 같이 우리가 정수형으로 자주 쓰이는 int와 long의 경우 정수를 해당 범위까지만 담을 수 있다.

 

Data Type 범위
int -2,147,483,648 ~ 2,147,483,647
long -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

자릿수로만 보면 가장 큰 정수 범위의 long도 19 자릿수까지밖에 정수를 담지 못한다. 입력 예시처럼 만약 100개의 숫자를 담아야 한다면, 이전에 풀던 방식으로는 해당 정수를 담지 못해 해결할 수 없습니다.

(unsigned long이나 unsigned long long 같은 데이터 타입도 결국 한계가 있습니다!)

 

이러한 문제점을 해결하기 위해서 여러 가지 방법이 있지만, 제가 떠올린 방법은 2가지입니다.

 

1. 배열을 이용하여 해당 숫자를 처리하기.

2. BigInteger객체 사용하기

 

1. 배열을 이용하여 해당 숫자 처리하기

 

성공코드

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int num = Integer.parseInt(br.readLine());
        char[] ch = br.readLine().toCharArray();
        int sum = 0;
        for (char c : ch) {
            int tmp = Character.getNumericValue(c);
            sum += tmp;
        }
        System.out.println(sum);
    }
}

char배열을 이용하여 입력받은 한 줄의 문자열(String)을 저장한 뒤 하나씩 꺼내면서 int형으로 바꾸어 합에 더해주는 방식입니다. 아주 간결한 코드가 되죠.

 

Character.getNumericValue()은 char형을 int로 바꿔주는 메서드입니다!

 

2. BingInteger객체 사용하기

 

성공코드

import java.io.*;
import java.math.BigInteger;

public class Main {
	public static void main(String args[]) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int va = Integer.parseInt(br.readLine());
		BigInteger bignum = new BigInteger(br.readLine());
		long sum = 0;
		
		for(int i = 0 ; i < va ; i++) {
			sum = sum + (bignum.remainder(new BigInteger("10"))).longValue();
			bignum = bignum.divide(new BigInteger("10"));
		}

		System.out.println(sum);
	}
	
	}

해당 코드는 BigInteger라는 객체에 대해 조금은 이해하고 있어야 합니다. 해당 객체는 기본 데이터 타입으로 받을 수 없는 크기의 데이터일 경우 객체로 처리하여 쉽게 계산할 수 있죠.

 

기본 사용법을 알려드리겠습니다.

 

BigInteger 선언

BigInteger bignum = new BigInteger(String type);

String type은 문자열 형식으로 객체에 집어넣어주어 정보를 기억하게 합니다.

BigInteger 사칙연산

System.out.println(bignum.add("10"));		//더하기
System.out.println(bignum.subtract("4"));	//빼기
System.out.println(bignum.multiply("2"));	//곱하기
System.out.println(bignum.divide("4"));		//나누기
System.out.println(bignum.remainder("10"));	//나머지

BigInteger 형 변환

int int_bignum = bignum.intValue(); //BigIntger -> int
long long_bignum = bignum.longValue(); //BigIntger -> long
float float_bignum = bignum.floatValue(); //BigIntger -> float
double double_bignum = bignum.doubleValue(); //BigIntger -> double
String String_bignum = bignum.toString(); //BigIntger -> String

 

BigInteger의 여러 메서드들로 저희가 쉽게 사용하는 연산들을 모두 구현할 수 있습니다. 해당 객체를 이용하여 저희는 이번 문제도 쉽게 해결할 수 있습니다 ~!!