관리 메뉴

밤색모자이크의 개발이야기

Project Euler Problem 5 : 1 ~ 20 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수 본문

Algorithm/Project Euler

Project Euler Problem 5 : 1 ~ 20 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수

밤색모자이크 2017. 6. 18. 21:47


Project Euler 문제를 해답을 포스팅합니다.

※ 주의 : 최적화는 할 수 있는 만큼했습니다. 따라서 속도면에서는 많이 부족합니다.

           문제를 푸는데 목표를 두었고 또한 TDD를 최대한 활용하였습니다.

           몇가지 문제의 경우 TDD를 안한 경우도 있습니다.

           혹시, 최적화 또는 속도 증가에 대한 부분을 지적해주실 분은 너무나도 감사합니다.



Project Euler Problem 5


1 ~ 10 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수는 2520입니다.

그러면 1 ~ 20 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수는 얼마입니까?




처음에는 단순이 그냥 for와 if만으로 무조건 반복하려고했으나 뭔가 아닌거 같아 고민을 더 했습니다.

그래서 일단 소수는 반드시 존재야하만 나눠 질 수 있으므로 숫자 N까지의 모든 소수를 곱한 메서드를 만들고, 해당 숫자를 나눠면서 안나눠지면 그 숫자의 소수를 구하여 곱하는 식으로 진행하였습니다.




Source Code


TestClass Code


public class TestClass { 

     
    @Test 
    public void testcalNumMul_Min() {
        PrimeNumMul primeNumMul = new PrimeNumMul(); 
        assertEquals(2520, primeNumMul.calNumMul_Min(10));
    } 
     
    @Test 
    public void testPrimeNum() {
        PrimeNumMul primeNumMul = new PrimeNumMul(); 
        assertEquals(210, primeNumMul.calPrimeNumMul(10));
        assertEquals(9699690, primeNumMul.calPrimeNumMul(20));
    } 
     
    @Test 
    public void testPrimeNumCheck() {
         
        PrimeNumMul primeNumMul = new PrimeNumMul(); 
         
        assertTrue(primeNumMul.primeNumCheck(2)); 
        assertFalse(primeNumMul.primeNumCheck(9)); 
    } 
}


Main Class Code
public class Main { 
    public static void main(String [] args) {
        PrimeNumMul primeNumMul = new PrimeNumMul(); 
         
        System.out.println(primeNumMul.calNumMul_Min(20)); 
    } 
}
PrimeNumMul Class Code
public class PrimeNumMul { 
     
    ArrayList<Integer> minNumbers = new ArrayList<Integer>(); 
    int maxNum; 
     
    public boolean primeNumCheck(int number) {
         
        for(int i=2; i<number/2; i++) {
            if( (number%i) == 0) 
                return false;
        } 
         
        return true; 
    } 
     
    public int calPrimeNumMul(int number) {
        int result = 1; 
        maxNum = number; 
         
        for(int i= 2; i<=number; i++) {
            if(primeNumCheck(i)) { 
                result *= i; 
            } 
        } 
        return result; 
    } 

    public long calNumMul_Min(int number) {
        long result = calPrimeNumMul(number); 
         
        for(int i=2; i<=maxNum; i++) { 
            if( (result%i) != 0) { 
                 
                for(int j=2; j<=i; j++) { 
                    long temp = result * j; 
                    if( (temp % i) == 0) { 
                        result *= j; 
                        break; 
                    } 
                }//end of j 
            } 
        }//end of i 
         
        return result; 
    } 

}

Comments