https://solution-is-here.tistory.com/105
이 글을 보고 오시면 더 쉽게 이해하실 수 있습니다.
https://www.acmicpc.net/problem/1110
문제를 보면 몇가지 조건들이 보인다.
1. 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만든다. (굳이 고려할 필요가 없다 뒤에서 설명)
2. 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다.
3. 다시 원래 수로 돌아올때 사이클의 길이를 구하라.
숫자 26을 예시로 들겠다.
26에서 가장 오른쪽 자리수인 6과 십의 자리와 일의 자리 수를 더한 값 8, 두 수를 붙이면 68이 된다.
이렇게 4번을 하면 다시 26으로 돌아온다.
위에서 주어진 수가 10보다 작은 경우를 고려하지 않아도 된다고 하는데 그 이유를 설명하겠다.
먼저 숫자가 3이라고 가정하면 숫자는 03이 된다.
코드를 보면 이해할수 있지만 어차피 03이나 3이나 프로그램은 가장 오른쪽 숫자를 3으로 인식한다.
* 나머지 연산자인 %을 사용하기 때문
코드를 보면서 설명하겠다.
1
2
3
4
5
6
7
8
9
10
11
|
num = int(input())
fir = num
a = 0
while True:
sec = fir // 10
thd = fir % 10
fir = thd*10 + (sec + thd)%10
a += 1
if fir == num:
break
print(a)
|
cs |
4번째 줄
while True: 무한 반복문을 사용해서 필자가 원할 때까지 반복하도록 했다.
5 ~ 8번째 줄
sec은 fir이란 수를 10으로 나눈 몫이다.
* //가 아닌 /을 사용하면 int가 아닌 double형태의 값이 나온다. ex) 1.2 , 1.7
thd은 fir를 10으로 나눈 나머지다.
fir이라는 수를 새로운 수로 바꿔서 다음 반복때 새로운 수가 나오도록 한다.
a에 1을 더한다. a는 사이클을 반복한 횟수
9번째 줄
만약 fir과 입력받은 수(num)이 일치한다면 반복문을 탈출한다.