https://www.acmicpc.net/problem/10757
큰 수니까 int가 아니라 long을 쓰면 되겠지?하고 접근했다가 실행시켜보니 답이 음수가 나와 털린 문제이다.
쎄해서 책을 뒤적거려보니, 예제 입력1에서 주어진 두 숫자가 예사롭지 않은 수였다.
9223372036854775807 = 263-1
9223372036854775808 = 263
그리고 long의 저장 가능한 값의 범위는 -263 ~ 263-1 이다.
배열로 직접 노가다 해야하나? 고민하다가 머리에 unsigned long이 스쳐 지나갔는데, 구글링해보니 자바는unsigned를 지원하지 않는다 하더라.
대신 BigInteger를 이용해 long의 범위를 초과하는 값을 저장할 수 있다고 한다.
BigInteger는 문자열로 이루어져 있기 때문에 숫자 범위의 제한이 없다고 한다.
BigInteger로 사칙연산하기
먼저 BigInteger를 사용하기 위해 다음 코드를 추가해준다.
import java.math.BigInteger;
그리고 add(), subtract(), multiply(), divide()를 사용하여 사칙연산을 하면된다.
다음은 사용 예시이다.
import java.math.BigInteger;
public class Main {
public static void main(String[] args){
BigInteger A = new BigInteger("12");
BigInteger B = new BigInteger("5");
System.out.println("A + B = " + A.add(B)); // A+B 결과 12
System.out.println("A - B = " + A.subtract(B)); // A-B 결과 7
System.out.println("A * B = " + A.multiply(B)); // A*B 결과 60
System.out.println("A / B = " + A.divide(B)); // A/B 결과 2
}
}
이를 이용하여 제출한 코드이다.
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));
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str);
String A = st.nextToken();
String B = st.nextToken();
BigInteger output = new BigInteger(A).add(new BigInteger(B)); //BigIntegar 사용
System.out.println(output);
}
}
추후 노가다를 통한 구현에 성공하면 이 게시물에 추가해 놓도록 하겠다.....
'알고리즘 > BAEKJOON' 카테고리의 다른 글
[백준] 2579번 계단오르기 -C++ (0) | 2022.02.15 |
---|---|
[백준] 11729번 하노이 탑 이동 순서 -자바(JAVA) (0) | 2022.01.24 |
[백준] 15829번 Hashing -자바(JAVA) (0) | 2022.01.19 |
[백준] 4673번 셀프 넘버 -자바(JAVA) (2) | 2022.01.19 |
[백준] 1929번 소수구하기/에라토스테네스의 체 -자바(JAVA) (0) | 2022.01.08 |