티스토리 뷰

[문제]

어떤 정수 n에서 시작해, n이 짝수면 2로 나누고, 홀수면 3을 곱한 다음 1을 더한다. 이렇게 해서 새로 만들어진 숫자를 n으로 놓고, n=1 이 될때까지 같은 작업을 계속 반복한다. 예를 들어, n=22이면 다음과 같은 수열이 만들어진다.

22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

n이라는 값이 입력되었을때 1이 나올때까지 만들어진 수의 개수(1을 포함)를 n의 사이클 길이라고 한다. 위에 있는 수열을 예로 들면 22의 사이클 길이는 16이다. i와 j라는 두개의 수가 주어졌을때, i와 j사이의 모든 수(i, j포함)에 대해 최대 사이클 길이를 구하라.

입력 예

1    10
100  200
201  210
900  1000

출력 예

1    10    20
100  200   125
201  210   89
900  1000  174


[소스]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package Cycle;
 
 
public class main_mh {
 
 
    public static void main(String[] args) {
 
 
        int inputMin = 1;
        int inputMax = 10;
        
        int cycleNum = 0;
        int cycleLeng = 0;
        int cycleMax = 0;
        
        for ( int i = inputMin; i <= inputMax; i++ ) {
            
            if ( i % 2 == 0 )     cycleNum = i / 2;
            else                cycleNum = i * 3 + 1;
            
            cycleLeng++;
            
            while ( cycleNum != 1 ) {
                
                if ( cycleNum % 2 == 0 )     cycleNum = cycleNum / 2;
                else                        cycleNum = cycleNum * 3 + 1;
                
                cycleLeng++;
            }
            
            cycleLeng++;
            
            if ( cycleLeng > cycleMax ) {
                cycleMax = cycleLeng;
            }
            
            cycleLeng = 0;
        }
        
        System.out.println(inputMin + " " + inputMax + " " + cycleMax);
    }
}
cs


[결과]


※ 출처http://codingdojang.com/scode/409?answer_mode=hide

'알고리즘' 카테고리의 다른 글

[코딩도장] 삽입정렬 응용  (0) 2016.10.28
[코딩도장] 문자열 짝수 번째 치환  (0) 2016.10.28
[코딩도장] 문자열 압축  (0) 2016.10.27
[코딩도장] Spiral Array  (0) 2016.10.26
[코딩도장] 숫자 개수 카운트  (0) 2016.10.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함