[백준 알고리즘][python] 1110번. 더하기 싸이클
1110번: 더하기 사이클
0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,
www.acmicpc.net
# 문제
0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.
26부터 시작한다. 2+6 = 8이다.
새로운 수는 68이다. 6+8 = 14이다.
새로운 수는 84이다. 8+4 = 12이다.
새로운 수는 42이다. 4+2 = 6이다.
새로운 수는 26이다.
위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.
N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.
# 입력
첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.
# 출력
첫째 줄에 N의 사이클 길이를 출력한다.
# 정답입니다!
n = int(input())
new = n # n으로 돌아올 때 비교를 위해 새로 n을 담은 변수
t = 0 # 사이클의 횟수 count를 위한 변수
# 문자열로 바꾸기
if new < 10 :
new = f'0{n}'
else :
new = f'{n}'
while True :
# 각 자릿수 더하기
m = f'{int(new[0]) + int(new[1])}'
# 한 자리 숫자 -> 앞에 0 붙여주기
if len(m) == 1 :
m = f'0{m}'
new = f'{new[1]}{m[1]}'
# 횟수 증가
t += 1
# 비교
if int(n) == int(new) :
break
print(t)
26
4
이 방법은 n을 문자열로 형변환을 시킨 뒤에 문자열 인덱스를 활용한 코드이다.
먼저 n을 입력받고, 비교를 위해 new라는 변수에 n을 다시 담아준다.
또 싸이클의 횟수를 계산하기 위해 t 라는 변수를 생성해준다. (count를 위한 것이므로 초기값은 0)
문자열로 바꿔준 뒤, while문으로 true일 경우 반복하게 해준다.
0, 1번 째 문자를 int형으로 다시 바꿔 더해준 뒤, 또 문자형으로 바꿔주고 m 이라는 변수에 담아준다.
만약 또 한자리 숫자가 나올 경우를 대비해 m의 문자 길이가 1 인 경우에 앞에 0을 붙여주도록 했다.
주어진 수(new)의 가장 오른쪽 자리 수[1]와 앞에서 구한 합(m)의 가장 오른쪽 자리 수[1]를 이어 붙여 new에 다시 저장해준다.
위의 과정을 거쳤으니 t에 +1을 해 횟수를 늘려준다.
이 new의 값이 맨 처음 값(n)과 같은지 int형으로 바꾼 뒤,
If문으로 비교를 해서 같다면 break를 해서 while문을 빠져나오도록 한다.
while문을 빠져나온 뒤에는 이 과정을 몇번을 반복했는지 t 값을 출력한다.
# ver02 - 형변환 없이 int형 그대로 계산
n = int(input())
new = n
t = 0
while True :
a = new // 10 # 10으로 나눈 몫
b = new % 10 # 10으로 나눈 나머지
# a+b의 나머지(가장 오른쪽 수)
c = (a+b) % 10
new = 10*b + c
t += 1
if n == new :
break
print(t)
26
4
위의 방법은 형변환으로 인해 번거로운 코드였다면,
이 코드는 수학적으로 접근해 비교적 간단한 코드이다.
while문 전까지는 위와 동일하고,
while문 안에서 변수 a에 10으로 new를 나누었을 때 몫 값(//)을 저장해준다. 이는 new의 가장 왼쪽 수가 된다.
변수 b에는 나머지값(%)을 저장해주고, 이는 new의 가장 오른쪽 수가 된다.
변수 c는 new의 왼쪽 수와 오른쪽 수를 더해준 값(a+b)에서 10으로 나누었을 때의 나머지값(%)을 저장해 줌으로써,
즉 a+b의 가장 오른쪽 수이다.
이제 new의 가장 오른쪽 수와 c의 가장 오른쪽 수를 합쳐주어야 한다.
new의 가장 오른쪽 수인 b에 10을 곱해주어서 두자리 수로 만들어 준 뒤, c를 더해준다.
이를 new에 새로 담아준다.
이러한 과정을 거쳤으니 t에 +=1 을 해주고,
if문으로 처음 입력 받은 수(n)와 새로운 수(new)가 같은지 비교한 뒤,
같다면 break를 통해 while문을 빠져나가도록 한다.
while문을 빠져나온 뒤에는 이 과정을 몇번을 반복했는지 t 값을 출력한다.
이 코드에서는 입력받은 값(n)이 한자리 숫자인지, 두자리 숫자인지 중요하지 않다.
왜냐하면, 10으로 한자리 숫자를 10으로 나누었을 경우 0이기 때문이다.