알고리즘

[백준] 1110 더하기 사이클 Python

아람2 2024. 9. 12. 17:38
반응형

1. 문제

https://www.acmicpc.net/problem/1110

주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다
주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의
가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다
그 새로운 수가 주어진 수와 같은 사이클 길이를 구하는 프로그램을 작성하시오

 

 

2. 접근 방식

10의 자리 수와 1의 자리 수를 구분하여 합치고 비교하는 방식을 반복해야 하니

재귀 함수를 구현해 보기로 했다

 

3. 전체 코드

# N 숫자 입력 받기
# 10의 자리 수 a 와 1의 자리 수 b 구분하기
# 10의 자리 수를 b 로, 1의 자리 수를 a + b 로 설정하기
# count+=1 해 주고 N 과 비교해서 다르면 또 돌기
# 이걸 반복해서 원래 N 과 같아지는지 확인하기 

def cycle(N, count):
    # 10 자리 수, 1자리 수 구분하기
    a = N // 10
    b = N % 10
 
    # 다시 숫자 조합하기
    # a+b 가 10보다 크다면 1자리 수만 남겨 놓기
    # if a+b >= 10:
    #     c = (a+b) % 10
    # else:
    #     c = (a+b)
    # new = (b*10) + c
    c = (a+b) % 10
    new = (b*10) + c
    count += 1

    # 새로운 조합과 기존 숫자가 같다면 count Return 
    if new == original:
        return count
    # 아니면 다시 재귀 돌리기 
    else:
        return cycle(new, count)

if __name__ == '__main__':
    # N 숫자 입력 받기
    original = N = int(input())

    # 사이클 길이 count 
    count = 0

    # 기존 숫자, count, 기존 
    print(cycle(N, count))

 

4. 코드 리뷰

 

코드 리뷰어 분이 아래 if 문을 줄일 수 있는 방법이 있지 않을까 제안해 주셔서

if a+b >= 10 없이 바로 c = (a+b) % 10 로 c 와 new 를 구했다

    # 다시 숫자 조합하기
    # a+b 가 10보다 크다면 1자리 수만 남겨 놓기
    if a+b >= 10:
        c = (a+b) % 10
    else:
        c = (a+b)
    new = (b*10) + c
반응형