today's alogrithm

[BOJ] 4375번 1 - JAVA

UR'im 2021. 6. 25. 20:40

https://www.acmicpc.net/problem/4375

 

4375번: 1

2와 5로 나누어 떨어지지 않는 정수 n(1 ≤ n ≤ 10000)가 주어졌을 때, 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오.

www.acmicpc.net

오늘 풀어본 문제는 한달전 풀었다가 실패했던 문제다.

참 다양하게 틀렸는데 시간초과, 런타임 에러(ArrayIndexOutOfBounds, NumberFormat) 등등 

오늘도 다시 풀었을때 네번에 실패를 맛봤다.. 이번엔 메모리 초과,, 

우선 런타임 에러 NumberFormat같은 경우 숫자 범위를 long타입으로 잡았더니 범위가 초과되서 발생한 에러였다.

이를 해결하기 위해 BigInteger 객체를 사용했다. 그러나 문제는 아래의 코드를 작성했을 때는 메모리 초과가 발생됬다.

import java.io.*;
import java.math.*;
public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuffer sb = new StringBuffer("1");
        BigInteger zero = new BigInteger("0");
        String input ;
        while((input = br.readLine()) != null){
        	BigInteger n = new BigInteger(input);
        	while(true){
        		BigInteger num = new BigInteger(sb.toString());
        		if(num.divide(n).compareTo(zero) > 0 && num.remainder(n).compareTo(zero)==0){
	        		bw.write(sb.length()+"\n");
	        		break;
	        	}
	        	sb.append("1");
        	}
        	sb.setLength(1);
        }
        bw.flush();
        bw.close();
        br.close();
    }
}

어느지점에서 메모리 초과가 발생한걸까 싶어서 생각해봤는데 StringBuffer사용을 안하는게 좋을 것 같아서 StringBuffer를 사용하지 않고 BigInteger에 직접 num*10+1의 형식으로 계산해줬다.

아래의 코드는 맞은 코드인데 한결 깔끔해진 코드를 볼 수 있다.

import java.io.*;
import java.math.*;
public class Main{
    static String input;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        while((input = br.readLine()) != null){
        	BigInteger n = new BigInteger(input);
        	BigInteger num = new BigInteger("1");
        	while(true){
        		if(num.divide(n).compareTo(BigInteger.ZERO) > 0 && num.remainder(n).compareTo(BigInteger.ZERO)==0){
	        		bw.write(num.toString().length()+"\n");
	        		break;
	        	}
	        	num = num.multiply(BigInteger.TEN);
	        	num = num.add(BigInteger.ONE);
        	}
        }
        bw.flush();
        bw.close();
        br.close();
    }
}

이번 문제를 풀면서 BigInteger객체 사용에 대해서 공부할 수 있었다.

처음엔 BigInteger에 대하여 잘 몰라서 비교나 사칙 연산을 그냥 사용하려고 했다가 에러 폭탄을 맛보고, BigInteger 객체를 공부하게 되는 시간이었다.

다음에는 자바 문서를 통해 직접 공부하여 활용 부분을 포스팅 할 생각이다.