Java에서 Scanner
와 BigInteger
를 사용하는 방법입니다.
Scanner
C/C++은 scanf
/print
, cin
/cout
과 같이 특정 자료형으로 입력을 받는 함수가 존재하지만, Java는 문자열 또는 바이트 단위로만 입력받을 수 있습니다. 이 때 사용하는 것이 Scanner
입니다.
new Scanner(System.in);
에서 System.in
을 new File("input.txt")
로 변경하면, stdin이 아닌 파일에서도 입력을 받을 수 있습니다.
Scanner
클래스에 대한 자세한 설명은 http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html 에 있지만, 자주 사용하는 메소드는 여기서 예제와 함께 살펴보겠습니다.
hasNextInt()
는 입력받을 정수가 있는지 확인하는 메소드입니다. 아래와 소스는 EOF까지 모든 정수를 입력받아 합을 구한 다음, 출력하는 프로그램입니다. 엄밀하게는 EOF는 아닙니다. hasNextInt
는 다음에 입력받을 것이 정수인지를 확인하는 메소드이기 때문에, 다음에 입력받을 것이 정수가 아닌 경우(예: 문자열)에는 false
를 리턴합니다.
int
를 제외한 다른 자료형으로 입력을 받을면, nextInt
와 hasNextInt
대신에 해당 자료형을 Int 대신 쓰면 됩니다. 지원하는 자료형은 BigDecimal
, BigInteger
, boolean
, byte
, double
, float
, int
, long
, short
입니다.
String
을 입력받고 싶은 경우에는 nextLine
과 hasNextLine
을 이용해서 다음 줄을 받아올 수 있습니다. 이 때, 조심해야 할 것은 줄바꿈('\n
') 입니다.
먼저, 아래 소스를 살펴봅시다.
1
hi
위와 같은 입력을 넣은 경우에는 n
에 1
이, 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
을 이용해서 별도의 생성자 없이 만들 수 있습니다.
아래 소스는 피보나치 수를 구해 배열에 저장하고 출력하는 프로그램입니다.
비교 역시 메소드를 이용해서 해야 합니다.
아래 프로그램은 두 수를 입력받아 compareTo
와 equals
를 호출 한 다음, 결과를 보여주는 프로그램입니다.
이외의 다양한 연산자는 https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html 에서 찾아볼 수 있습니다.
BigInteger
와 비슷하게 BigDecimal
은 실수를 담을 수 있는 자료구조입니다. BigDecimal
은 BigInteger
와 사용법이 비슷합니다.
BigDecimal
을 이용해서 풀 수 있는 문제입니다. 10827번 문제: a^b
댓글 댓글 쓰기