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++; } }