Java Scanner와 BigInterger 사용하기

Java에서 ScannerBigInteger를 사용하는 방법입니다.

Scanner

C/C++은 scanf/print, cin/cout과 같이 특정 자료형으로 입력을 받는 함수가 존재하지만, Java는 문자열 또는 바이트 단위로만 입력받을 수 있습니다. 이 때 사용하는 것이 Scanner 입니다.

new Scanner(System.in); 에서 System.innew File("input.txt")로 변경하면, stdin이 아닌 파일에서도 입력을 받을 수 있습니다.

Scanner 클래스에 대한 자세한 설명은 http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html 에 있지만, 자주 사용하는 메소드는 여기서 예제와 함께 살펴보겠습니다.

hasNextInt()는 입력받을 정수가 있는지 확인하는 메소드입니다. 아래와 소스는 EOF까지 모든 정수를 입력받아 합을 구한 다음, 출력하는 프로그램입니다. 엄밀하게는 EOF는 아닙니다. hasNextInt는 다음에 입력받을 것이 정수인지를 확인하는 메소드이기 때문에, 다음에 입력받을 것이 정수가 아닌 경우(예: 문자열)에는 false를 리턴합니다.

int를 제외한 다른 자료형으로 입력을 받을면, nextInthasNextInt 대신에 해당 자료형을 Int 대신 쓰면 됩니다. 지원하는 자료형은 BigDecimal, BigInteger, boolean, byte, double, float, int, long, short 입니다.

String을 입력받고 싶은 경우에는 nextLinehasNextLine을 이용해서 다음 줄을 받아올 수 있습니다. 이 때, 조심해야 할 것은 줄바꿈('\n') 입니다.

먼저, 아래 소스를 살펴봅시다.

1
hi

위와 같은 입력을 넣은 경우에는 n1이, s"hi"가 들어갈 것 같지만, 실제로 s에는 "\n"이 들어가있습니다. 그 이유는 nextLine은 마지막으로 입력받은 위치에서 줄바꿈('\n')이 나올 때 까지를 입력받기 때문입니다. 올바르게 입력을 받으려면, 6번줄과 7번줄 사이에 sc.nextLine();을 삽입해 다음 줄로 이동시켜야 합니다.

BigInteger

int는 -231(-2147483648)에서 231-1(2147483647)까지 저장할 수 있습니다. long (C++에서는 long long)은 -263(-9223372036854775808)에서 263-1(9223372036854775807) 까지 저장할 수 있습니다. 이보다 더 큰 숫자를 사용해야 하는 경우에는 어떤 자료형을 써야 할까요? C/C++을 사용한다면, 직접 구형해야 하거나 라이브러리를 이용해야 할 것입니다. 하지만, Java는 java.math.BigInteger로 지원하고 있습니다.

BigInteger는 문자열을 이용해서 만들 수 있습니다. 두 정수를 입력없이 더하고 출력하는 프로그램을 작성해봅시다.

Scanner는 nextBigInteger를 지원하기 때문에, Scanner를 이용하면 두 수를 입력받아 합을 계산하는 프로그램을 작성할 수 있습니다. 10757번 문제: 큰 수 A+B

BigInteger+, -, *, /, += 와 같은 연산자를 지원하지 않기 때문에, 메소드를 이용해야합니다. http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html 에 모든 메소드에 대한 설명이 나와있습니다. 0, 1, 10은 static 필드 BigInteger.ZERO, BigInteger.ONE, BigInteger.TEN 을 이용해서 별도의 생성자 없이 만들 수 있습니다.

아래 소스는 피보나치 수를 구해 배열에 저장하고 출력하는 프로그램입니다.

비교 역시 메소드를 이용해서 해야 합니다.

아래 프로그램은 두 수를 입력받아 compareToequals를 호출 한 다음, 결과를 보여주는 프로그램입니다.

이외의 다양한 연산자는 https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html 에서 찾아볼 수 있습니다.

BigInteger와 비슷하게 BigDecimal은 실수를 담을 수 있는 자료구조입니다. BigDecimalBigInteger와 사용법이 비슷합니다.

BigDecimal을 이용해서 풀 수 있는 문제입니다. 10827번 문제: a^b


댓글 댓글 쓰기