백준 1110번 더하기 사이클
문제
0 이상 99 이하의 정수 N이 주어진다. N이 한 자리 수면 앞에 0을 붙여 두 자리로 보고, 각 자리의 숫자를 더한다. 원래 수의 오른쪽 자리와 그 합의 오른쪽 자리를 이어 붙인 수가 새 수가 된다. 예를 들어 26은 2+6=8이므로 68이 되고, 68은 84, 84는 42, 42는 26으로 4번 만에 돌아온다. 이 연산이 원래 수로 돌아올 때까지의 횟수(사이클 길이)를 출력한다.
풀이
원래 수를 cf에 따로 저장해 두고, 현재 수 N으로 한 번씩 연산을 반복한다. 연산마다 count를 1 올리고, 새로 만든 수가 cf와 같아지면 반복을 끝낸다.
자릿수는 10으로 나눈 몫과 나머지로 분리한다. 26이라면 몫 2와 나머지 6을 더해 합 T를 구한다. 새 수는 원래 수의 일의 자리(N % 10)에 10을 곱한 값에 합의 일의 자리(T % 10)를 더해 만든다. 합이 10을 넘을 수 있어서 T에도 나머지 연산을 걸어 일의 자리만 쓴다.
N = int(input())
count = 0
cf = N
while N < 100:
T = (N // 10) + (N % 10)
# 8 2 6
New = (N % 10) * 10 + (T % 10)
# 68 6 X 10 + 8
count += 1
N = New
if New == cf:
break
print(count)짚고 갈 점
- 원글 작성자는
if앞에서N = New를 하는 이유를 이해하지 못했다고 적었다. 다음 반복에서는 방금 만든 새 수를 가지고 다시 자릿수를 나눠야 하기 때문에,N을 새 수로 갱신하는 줄이다. 이 줄이 없으면 같은N으로 계속 같은 연산을 하게 되어 무한 반복에 빠진다. - 연산 결과는 항상 두 자리 이하라서
while N < 100조건은 항상 참이다. 실제로는break가 반복을 끝낸다. - N이 한 자리 수여도
N // 10이 0이 되어 따로 0을 붙이지 않고 같은 식으로 계산된다. 입력 0은 1, 입력 1은 60이 나온다. - 이 문제에서 포매팅과
try / except로 접근했다가 막혔고, 다른 글을 참고해 풀었다.