관리 메뉴

스터디 기록 일지 저장소

BOJ 1271. 엄청난 부자 본문

Launguages/Java

BOJ 1271. 엄청난 부자

Err0RtheMAX 2020. 12. 30. 23:51

이전까지 IntelliJ 에 구동을 해도 알고리즘의 복잡도나 사용한 메소드의 종류에 구애를 받지 않고 정상적으로 빠른 시간 내에 컴파일

되었다. 그래서 다음과 같이 코드를 구동했지만 백준 온라인 저지에서는 컴파일 에러, 런타임 에러가 발생했다.

 

 

import java.util.Scanner;

public class SuperRich2 {
    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        int money = scan.nextInt();
        int people = scan.nextInt();

        System.out.println(money / people);
        System.out.println(money % people);

    } //runtime error

 

 

 

런타임 에러가 나는 이유는 문제의 조건을 보면 알 수 있는데, 입력받는 money의 범위가 10의 1000제곱이라는 매우 큰 수다.

따라서 안그래도 태생적으로 다른 프로그래밍 언어보다 구동이 느린데 이렇게 큰 수를 받으니 문제의 답은 맞아도 런타임이 초과되는

일이 발생한다.

 

 

import java.io.*;

public class SuperRich2{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.in));

        int money = Integer.parseInt(br.readLine());
        int people = Integer.parseInt(br.readLine());
        br.close();

        bw.write(String.valueOf(money / people));
        bw.write(String.valueOf(money % people));
        bw.close();

    }
} // runtime error

 

 

 

그래서 플랜 B로 기존에 사용했던 불가피하게 기존에 일일히 값을 받을 때마다 바로바로 출력 처리해서 처리 시간이 오래 걸리는 Scanner 메소드 대신에 java.io 패키지에 있는 BufferedReader, BufferedWriter을 이용하여 처리를 했다. 처음보다는 런타임 시간은 줄어들기는 했지만 여전히 런타임 오류가 발생함을 알 수 있었다.

 

 

import java.math.BigInteger;
import java.util.Scanner;
import java.io.IOException;

public class SuperRich2{
    public static void main(String[] args) throws IOException{

        Scanner scan = new Scanner(System.in);
        BigInteger money = scan.nextBigInteger();
        BigInteger people = scan.nextBigInteger();

        System.out.println(money.divide(people));
        System.out.println(money.mod(people));

    }
}

 

그래서 엄청나게 큰 정수형을 받는 java.math.BigInteger 을 사용하는 방법밖에 없다.

말 그대로 엄청난 큰 정수형을 받는 메소드를 사용하고, Scanner 메소드와 같이 사용한다.

(BufferedReader, BufferedWriter로 사용하면 math.BigInteger에서 인식을 못하는 오류가 발생한다.)

 

BigInteger형 변수들을 계산할 때, 기존의 사칙연산 부호가 아닌 A.divide(B), A.multifly(B), A.mod(B) 와 같은 형식으로 메소드를 호출해서 사용해야 하는 불편함이 있다.

 

 

 

결론 :  일단 런타임 제한시간이 촉박하지 않으면 가장 쉽게 사용할 수 있는 Scanner 사용, 런타임 제한시간이 촉박하면 BufferedReader, BufferedWriter 사용,  그렇게 했음에도 너무 큰 수여서 런타임이 초과하는 경우라면, math.BigInteger을 호출하여 int형 변수 대신에 BigInteger형 변수를 선언하여 사용한다.

 

 

 

 

Comments