14928번 : 큰 수(BIG)

상환·2021년 12월 9일
0
post-thumbnail

문제

제연이는 그의 생일(2000년 3월 3일)을 기념해 자신이 가장 좋아하는 수를 20000303으로 나눈 나머지를 구해 그 수만큼 잠을 자기로 했다. 제연이가 얼마나 잠을 잘 수 있을지 구하자.

입출력

1. 입력

첫째 줄에 제연이가 가장 좋아하는 수 N이 주어진다. (N ≤ 10^1,000,000)

2. 출력

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();
    }
}

결과는

풀었다.

kotlin code

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)
}
profile
레모네이드 커피

0개의 댓글