[백준] 1110번 더하기 사이클 | 파이썬 Python

문제

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.

26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.

위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.

N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.

 

출력

첫째 줄에 N의 사이클 길이를 출력한다.

 

예제

 

나의 풀이

N = int(input())

def cal(num, cnt):
    str_num = str(num)

    if N == num and cnt != 0:
        return cnt

    elif num < 10:
        num = int(str(str_num) + str(str_num)) 
        return cal(num, cnt+1)

    else:
        li = [int(i) for i in str_num]
        plus = sum(li)
        num = int(str(li[-1]) + str(plus)[-1])
        return cal(num, cnt+1)

print(cal(N, 0))
  • 재귀함수를 이용해서 풀어봤다.
  • 수가 `10`보다 작은 경우와 큰 경우로 나눠서 카운트를 하나씩 더해가며 플러스 연산을 수행한다.
  • 새로운 수가 `N`과 동일한 경우 카운트를 출력한다.

 

다른 사람의 풀이

N = int(input())
num = N
cnt = 0

while True:
    a = num // 10
    b = num % 10
    c = (a + b) % 10

    num = (b * 10) + c
    cnt += 1

    if N == num:
        print(cnt)
        break
  • 정수를 문자열로 변환할 필요 없이 몫과 나누기를 구하는 연산자로 주어진 정수를 쉽게 분해할 수 있다.
  • 너무너무 깔끔하고 신박하고 마음에 들었던 풀이!