관리 메뉴

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

Project Euler Problem 14 : 백만 이하로 시작하는 우박수 중 가장 긴 과정을 거치는 것은? 본문

Algorithm/Project Euler

Project Euler Problem 14 : 백만 이하로 시작하는 우박수 중 가장 긴 과정을 거치는 것은?

밤색모자이크 2017. 6. 19. 10:48


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

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

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

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

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



Project Euler Problem 14


양의 정수 n에 대하여, 다음과 같은 계산 과정을 반복하기로 합니다.

n → n / 2 (n이 짝수일 때)
n → 3 n + 1 (n이 홀수일 때)

13에 대하여 위의 규칙을 적용해보면 아래처럼 10번의 과정을 통해 1이 됩니다.

13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1

아직 증명은 되지 않았지만, 이런 과정을 거치면 어떤 수로 시작해도 마지막에는 1로 끝나리라 생각됩니다. 
(역주: 이것은 콜라츠 추측 Collatz Conjecture이라고 하며, 이런 수들을 우박수 hailstone sequence라 부르기도 합니다)

그러면, 백만(1,000,000) 이하의 수로 시작했을 때 1까지 도달하는데 가장 긴 과정을 거치는 숫자는 얼마입니까?

참고: 계산 과정 도중에는 숫자가 백만을 넘어가도 괜찮습니다.




딱히 문제가 별로 없는 알고리즘이었습니다. 그냥 그대로 쓰면될거 같아서 별도의 테스트도 작성하지 않았습니다.




Source Code


Main Class Code

public class Main { 
    public static void main(String [] args) {
         
        long currentNum = 0;
        long max = 0; 
        long result = 0; 
        long count = 0; 
        long calNum = 0; 
         
        while(currentNum <= 1000000) { 
             
            calNum = ++currentNum; 
             
            while(true) { 
                if( (calNum%2) == 0) calNum /= 2;
                else calNum = 3 * calNum + 1;
                count++; 
                 
                if(calNum == 1) 
                    break; 
            }//end of while infinity 
             
            if(max < count) { 
                max = count; 
                result = currentNum; 
            } 
            count = 0; 
        } 
         
        System.out.println( result ); 
    } 
}


Comments