본문 바로가기

Algorithm/Programmers lv.1

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

https://school.programmers.co.kr/learn/courses/30/lessons/12943

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

짝수인 경우와 홀수인 경우를 나눠서 생각을 해주었고, 500회 이상의 연산과 같은 예외처리를 따로 해줬다.

의식의 흐름대로 코드를 짰더니 뭔가 장황해보인다. 그래서 좀 더 축약할 수 있는 방법을 생각해보았다.

def solution(n):
    cnt = 0
    while n != 1:
        if n % 2 == 0:
            n /= 2
            cnt += 1
        else:
            n = 3 * n + 1
            cnt += 1
        if cnt == 500:
            cnt = -1
            break

    return cnt

 

 

다음과 같이 삼항연산자를 사용하여 고쳐봤다.

n = int(input())
cnt = 0

while n != 1:
    n /= 2 if n % 2 == 0 else n * 3 + 1
    cnt += 1
    if cnt == 500:
        cnt = -1
        break

print(cnt)

 

하지만 답이 계속 -1로 나온다.. 뭐가 문제인지 모르겠다.

 

n = int(input())
cnt = 0

while n != 1:
    n = n / 2 if n % 2 == 0 else n * 3 + 1
    cnt += 1
    if cnt == 500:
        cnt = -1
        break

print(cnt)

 

이상하게 n /= 2가 아닌, n = n / 2로 고쳐 써놓으니 된다. 왜 이런지 모르겠다..

 

하지만 이 코드는, n = 1일때의 예외처리를 포함하지 못한다. cnt가 n을 연산하는 식의 바깥에 있기 때문이다.

 

n = int(input())
cnt = 0

if n == 1:
    cnt = 1
else:
    while n != 1:
        n = n / 2 if n % 2 == 0 else n * 3 + 1
        cnt += 1
        if cnt == 500:
            cnt = -1
            break

print(cnt)

 

그럼 위와 같이 작성해야 하는데.. 그냥 첫번째 코드가 가장 나아보인다.