1.문제소개

어떤 정수 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

2.문제 기획 의도

함수를 정의하고 if-문으로 이 함수를 호출하여 반환되는 값으로 조건 테스트하기 (출처 : 코딩도장) http://codingdojang.com/scode/409

3.문제 풀이 및 시연


In [4]:
def cypro(k):                     # def 으로 cypro(k)라는 함수를 정의해준다.
    cl = 1                        # cl의 값을 1로 할당. (cl = 싸이클의 길이 = 1부터 시작)
    while k != 1:                 # while(조건반복) k≠1 인지 계속 비교 (k=1이면 반복중지)
        if k%2 == 0:              # 만약 k를 2로 나누었을때 나머지가 0이라면 (k가 짝수라면)
            k = k/2               # k는 k/2 으로 할당해준다.              
        else:                     # k가 홀수라면
            k = 3*k + 1           # k를 3*k+1 으로 할당해준다.
        cl += 1                   # 이때 cl 변수 값은 1 증가한다. 
    return cl                     # 증가한 cl 변수 값을 반환. 다시 반복. ** 여기까지가 cypro함수 정의

In [5]:
i=int(input('INPUT MIN NUM : '))  # 문자열 'INPUT MIN NUM : '을 받아 (소수점이 없는) 정수로 만들어줌
j=int(input('INPUT MAX NUM : '))

arw=[]                            # arw에 빈 리스트 할당. (빈 리스트를 만든 이유: 뒤에서 arw리스트에 항목을 추가하기 위함)

for t in range(i,j+1):            # i부터 j까지 의 숫자 시퀀스에서 t에 대해 반복
    arw.append(cypro(t))          # arw리스트 끝에 cypro(t) 항목을 추가. 즉 비어있는 arw리스트를 cypro(t)로 채운다.
print(max(arw))                   # arw의 최대값을 출력


INPUT MIN NUM : 1
INPUT MAX NUM : 10
20

4.풀이 중 사용했던 기술 소개

● def : 함수를 정의 ● while-문: 조건반복(conditional loop: 어떤 상황이 일어날 때까지 반복) while 조건: 명령문 형식으로 쓰인다. 조건이 False가 되는 시점까지 계속 실행된다. ● if else : 조건문. if 조건: 명령문 else : 명령문 형식으로 쓰인다. 특정조건에서만 실행되는 명령문이다. ● return : 반환문. 반환문에는 표현식이 포함될 수 도 있다. 또한 이 표현식의 값이 함수로부터 반환되며, 이 값이 함수 호출식의 값이 된다. (반환된 값은 함수를 호출한 코드로 돌아감) ● input() : 사용자로부터 문자열을 받는 함수 ● int() : 다른 데이터 타입을 정수형으로 변환. 소수점을 버리고 정수로 반환해준다. ● for-문: 계수반복(counting loop: 특정횟수 만큼 반복. 반복문을 몇번 실행할지 미리 아는 경우에 사용하기 좋음.) for 이름(항목) in 표현식 : for 원소(항목) in 시퀀스 : 형식으로 쓰인다. 이때 in 뒤의 표현식이나 시퀀스는 순회가능한 객체이어야 함. ● range(n) : 0부터 n-1 사이의 정수 시퀀스인 범위 객체를 만들어 낸다. ● .append() : 리스트 끝에 항목 추가 ● max() : 최대값