제연이는 그의 생일(2000년 3월 3일)을 기념해 자신이 가장 좋아하는 수를 20000303으로 나눈 나머지를 구해 그 수만큼 잠을 자기로 했다. 제연이가 얼마나 잠을 잘 수 있을지 구하자.
첫째 줄에 제연이가 가장 좋아하는 수 N이 주어진다. (N ≤ 10^1,000,000)
N을 20000303으로 나눈 나머지를 출력한다.
최대값을 보면 BigInteger를 쓰는 것을 알 수 있다. 척보면 척이지
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
BigInteger b = new BigInteger(scan.next());
System.out.println(b.divide(new BigInteger("20000303")));
}
}
결과는 시간초과
시간초과?? 처음 시간초과를 보고 입출력 시간이 그렇게나 많이 잡아먹나? BufferedReader, BufferedWriter로 바꿔볼까? 해서 바꿨지만 실패
알고보니 다량의 수를 divide메소드로 나눴을 때 스펙이 짱짱한 PC에선 빠르게 잘 돌아가지만 백준의 제출환경에선 오래걸리는 것이였다.
BigInteger의 나머지 연산에 대해 구글링한 결과 자릿수를 하나씩 늘려가면서 연산하는 방법을 찾았다.
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));
String n = br.readLine();
long remain = 0;
for(int i=0; i<n.length(); i++){
remain=(remain*10+n.charAt(i) - '0') % 20000303;
}
System.out.println(remain);
br.close();
}
}
결과는
풀었다.
import java.util.*
fun main() {
val scan = Scanner(System.`in`);
val n = scan.next()
var remain = 0;
for (a in 0 until n.length){
remain = (remain * 10 + (n.get(a).code - '0'.code)) % 20000303;
}
println(remain)
}