알고리즘
[백준] 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
반응형