기록하는 개발자

[백준 14928번] 큰 수 - JAVA 알고리즘 본문

Baekjoon Online Judge

[백준 14928번] 큰 수 - JAVA 알고리즘

gitseok 2022. 5. 2. 13:45

14928번
문제
제연이는 그의 생일(2000년 3월 3일)을 기념해 자신이 가장 좋아하는 수를 20000303으로 나눈 나머지를 구해 그 수만큼 잠을 자기로 했다. 제연이가 얼마나 잠을 잘 수 있을지 구하자.
입력
첫째 줄에 제연이가 가장 좋아하는 수 N이 주어진다. (N ≤ 101,000,000)
출력
N을 20000303으로 나눈 나머지를 출력한다.
예제 입력 예제 출력
   
20000303200003032000030320000303200003032000030320000303200003032000030320000303 0

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.math.BigInteger;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.regex.*;

public class Main {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언

		//long start = System.currentTimeMillis();
		
		/*
		BigInteger bigNumber = new BigInteger(br.readLine());
		BigInteger bigNumber2 = new BigInteger("20000303");
		bw.write(bigNumber.remainder(bigNumber2)+"");
		*/
		
		String num = br.readLine();
		long remainder = 0;
		for (int i=0; i<num.length(); i++) {
			remainder = (remainder * 10 + (Character.getNumericValue(num.charAt(i)))) % 20000303;
			//bw.write(remainder+"\n");
		}
		
		
		//long end = System.currentTimeMillis();
		bw.write(remainder+"");
		//bw.write("시작시간 : "+start);
		//bw.write("종료시간 : "+end);
		//bw.write("소요시간 : "+(end-start));
		bw.close();
		br.close();
	}
}

실행 결과

큰수라서 당연히 BigInteger 를 사용했는데 시간 초과가 발생해서 어떤식으로 사용하는지 찾아봤습니다.

for문을 이용해서 입력된 수의 가장 높은 자리부터 한자리씩 추가하며  지정한 수 20000303 로 나눈 나머지를 출력해서 비교적 작은 수를 계산하기 때문에 시간이 더 적게 소요됩니다.

 

예제 값을 기준으로 테스트 해보았을때

  시작시간 종료시간 소요시간
BigInteger  1651458138577 1651458147975 9398
for문 1651458180034 1651458180904 870

소요시간이 위와 같이 1/10으로 단축된 것을 볼 수 있습니다.

 

개인적으로 정리한 내용을 간단하게 풀어 작성했습니다.
이해가 안가는 부분은 댓글 남겨주시면 설명해드리겠습니다.
Comments