본문 바로가기
알고리즘/프로그래머스

[프로그래머스] 콜라츠 추측

by 며루치꽃 2020. 12. 27.

1. 문제

programmers.co.kr/learn/courses/30/lessons/12943

 

코딩테스트 연습 - 콜라츠 추측

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. 1-1. 입력된 수가 짝수라면 2

programmers.co.kr

2. 내가 생각했던 첫번째 풀이과정

 

1) 함수 밖에 전역 변수 count를 선언해줍니다

2) 함수를 실행했을 때 count가 500이 되지 않으면 홀수인지 짝수인지 구분합니다

짝수일 경우: number를 2로 나눈 몫으로 대체하고, count +1 을 해주게 됩니다. 

그 후, 나눈 몫을 매개변수로 재귀함수를 실행해줍니다

홀수일 경우: 숫자가 1인지 확인합니다(짝수인 경우에 생략한 이유는 1은 홀수이기 때문에 생략하였습니다)

1이 아니라면 (number * 3) + 1 값을 number 변수에 넣어 재귀함수를 실행해줍니다

만약 1일 경우 count를 출력해줍니다

 

3. 내가 생각했던 두번째 풀이과정

프로그래머스에서 전역변수를 인정해주지 않는 것 같아 첫번째 풀이과정을 포기하였습니다. 

포기한 이후에 while문으로 대체하였습니다

4. 나의 첫번째 풀이

number = int(input())
count = 0

def solution(number):
    global count
    if count <= 500:
        if number % 2 == 0: # 짝수
            number = (number // 2)
            count += 1
            solution(number)
        else:   #홀수라면 
            if number != 1: #1이 아니라면
                number = (number * 3) + 1
                count += 1
                solution(number)
            else: #1이라면 
                print(count)
                return count
    else:
        return -1

5. 나의 두번째 풀이

def solution(num):
    count = 0
    if num == 1:
        return 0
    while True:
        num = num/2 if num % 2 == 0 else (num*3)+1
        count += 1
        if num == 1:
            # print(count)
            return count
        elif count > 500:
            # print(count)
            return -1
    # print(count)
    return count

6. 다른 사람의 풀이

def collatz(num):
    answer = 0
    while answer < 500:
        answer += 1
        if num % 2 == 0:
            num = num / 2
        else:
            num = (num * 3) + 1
        if num == 1:
            break
    if answer == 500:
        answer = -1

    return answer

7. 새로 알게된 점

파이썬 전역변수를 사용할 때는 global 로 선언하면 함수 내에서 변수로 이용할 수 있다

 

댓글