

cnt = 0 #싸이클 횟수 old = int(input()) #기존 숫자 입력 new = old #새로운 숫자 //가장 처음에는 기존 숫자를 저장 while True: oldFirst = new//10 #이전 숫자의 십의 자리수 저장 oldSecond = new%10 #이전 숫자의 일의 자리수 저장 oldSum = oldFirst + oldSecond #각 자리수 합 new = oldSecond*10 + oldSum%10 #다음 숫자 생성(이전 숫자의 일의 자리수와 이전 숫자 자리수의 합의 일의 자리수 결합) cnt += 1 #싸이클 횟수 1 추가 if old == new: break #기존 숫자와 새로운 숫자가 같으면 종료 print(cnt) #싸이클 횟수 출력
한 줄씩 풀이해 보자.
cnt = 0 싸이클이 몇번 돌았는지 확인하기 위한 변수이다. 아래 while문을 한번 돌 때마다 1씩 추가된다.
old = int(input()) 기존 숫자를 입력받는 변수이다. 예제에서는 26을 입력했다.
new = old 다음 숫자를 저장하는 변수이다. 여기서 new를 old로 초기화 시켜주었는데 그 이유는 다음과 같이 설명하겠다.
이전 숫자의 일의 자리수와 이전 숫자의 합의 일의 자리수를 붙여서 다음 숫자가 결정된다. 그 다음 싸이클 횟수(
cnt)를 1 추가하고 여기서 다음 숫자가 기존 숫자(이전 숫자가 아닌 제일 처음 입력받은 숫자[예제에서는 26])와 일치하는지 확인한다. 일치하지 않는다면 다음 숫자의 십의 자리수(new//10)와 일의 자리수(new%10)를 이전 숫자의 십의 자리수(oldFirst)와 일의 자리수(oldSecond)에 각각 할당시켜준다.
즉, 새로운 수가 기존 숫자와 같지 않다면 새로운 수를 이용하여 또 다른 새로운 수를 만들어야 하기 때문에 새로운 수가 이전 숫자가 되고 또 다른 새로운 수가 다음 숫자가 되는 것이다.그러나 맨 처음에,
oldFirst와oldSecond에는 기존 숫자의 십의 자리수와 일의 자리수가 와야하기 때문에new에old를 할당시켜준다.
while True: 반복문 안에 탈출 조건이나 실행을 종료시키는 조건이 없다면 계속 반복문을 실행한다.
oldFirst = new//10 3번에서 설명한 대로 가장 처음에는 기존에 입력받은 old변수를 new변수에 넣어주었기 때문에 oldFirst = old//10과 같은 의미이다. 예제에서는 26//10이므로 oldFirst = 2가 된다.
oldSecond = new%10 5번과 마찬가지로 oldSecond = old%10과 같은 의미이고 예제에서는 26%10이므로 oldSecond = 6이 된다.
oldSum = oldFirst + oldSecond 이전 숫자의 각 자리수의 합이다. 예제에서는 8이 된다.
new = oldSecond*10 + oldSum%10 이전 숫자를 가지고 새로운 수를 만들어야 한다.
새로운 수는 이전 숫자의 일의 자리수(oldSecond)와 이전 숫자의 합의 일의 자리수(oldSum%10)를 순서대로 붙여서 만든다. oldSecond가 십의 자리수가 되므로 oldSecond에 10을 곱해준다. 예제에서 new는 68이 된다.
cnt += 1 새로운 수가 만들어지면 싸이클을 한번 돈 것이다.
if old == new: break 기존 숫자와 새로운 수가 같으면 while문을 빠져나간다.print(cnt) while문을 빠져나왔다면 싸이클 회전 수를 출력하고 문제가 끝이난다.
#include <iostream> using namespace std; int d(int n) { return n % 10; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int N; int newNum; int cnt = 1; cin >> N; int tmpN = N; while (true) { int de = (tmpN - d(tmpN)) / 10; newNum = d(tmpN) * 10 + d(d(tmpN) + de); if (newNum == N) { cout << cnt; break; } else tmpN = newNum; cnt++; } }