[ 백준 문제 1110 / 파이썬 ] 더하기 사이클

2023. 2. 9. 18:13백준/파이썬

 

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의 사이클의 길이를 구하는 프로그램을 작성하시오.

 

반복 해서 입력받고 출력을 받아야 됩니다.

정해진 반복횟수가 없으니 while문을 써주는 것이 더 좋겠습니다.

 

제가 딱 떠올린 방법은 문자열 인덱스를 이용하는 것이었습니다.

 

import sys

input = sys.stdin.readline
cycle = 0

start_num = input()

num = start_num

while True:
   if int(num) < 10:
      num = "0" + num

   sum = int(num[0]) + int(num[1])
   sum = str(sum)

   if int(sum) < 10:
      sum = "0" + sum

   new_num    = num[1] + sum[1]

   cycle += 1

   if int(new_num) == int(start_num):
      break
   else:
      num = new_num

print(cycle)

 

이렇게 코드를 작성했는데 예제 중 0, 26, 71을 입력했을 땐 맞게 출력 됐습니다.

그런데 55, 1을 입력하면 무한루프에 걸립니다.

 

더보기

55를 넣었을 때;

 

첫번째 반복문:

num = 55

sum = 5 + 5 = 10

new_num = 5 + 0 = 50

 

두번째 반복문:

num = 50

sum = 5 + 0 = 5

if문에 걸려서 "05"

new_num = 0 + 5

 

세번째 반복문:

num = 5

if문에 걸려서 "05"

sum = 0 + 5 = 5

if문에 걸려서 "05"

new_num = 55

 

따라서 cycle이 3이 되어야함.

 

왜 이런 문제가 생겼을까요?

siyamaki

55 입력 시 cycle 1일때
sum = 5가 되며,  17번째 줄의 if문을 타 sum은 '05'라는 문자열이 됩니다.
여기서 new_num은 num[1]과 sum[1]의 문자열 연결에 의해 '05'가 되고
다시 while문으로 돌아와 11번째줄의 if문에 참이 되어 '05'가 '005'가 되버려서
num[0] + num[1]의 값이 0과 0이라 계속 0으로 무한 루프를 돕니다.
마지막에 문자열을 숫자로 바꿔주시거나 모듈러 연산으로 1의자리를 떼오는 방법이 있습니다.

 

꼼수....:

import sys

input = sys.stdin.readline
cycle = 0

start_num = input()

num = start_num


while True:
   if int(num) < 10:
      num = "0" + num

   sum = int(num[-2:-3:-1]) + int(num[:-2:-1])
   sum = str(sum)

   new_num    = num[:-2:-1] + sum[:-2:-1]

   cycle += 1

   if int(new_num) == int(start_num):
      break
   else:
      num = new_num

print(cycle)

 역으로 슬라이싱 해줬어요.

에러 납니다. 끝에 엔터가 읽혀서 그런 것 같아요.

 

모듈러 연산으로 자리에 맞는 숫자를 불러오는 것이 좋겠습니다.

 

 

나의 최종 정답 :

# 정수를 str로 입력받기 (시퀀스를 이용해주기 위함)
start_num = input()
num = start_num
cycle = 0

while True:
   # 만약 입력받은 num이 10미만이라면 앞에 0붙이기
   if int(num) < 10:
      num = "0" + num

   # 10의자리 수 + 1의자리 수
   sum = (int(num) // 10) + (int(num) % 10)

   # 새로운 숫자
   new_num    = str(int(num)%10) + str(sum%10)

   # 새로운 숫자가 탄생하면 cycle+1
   cycle += 1

   # 만약 탄생한 new_num이 처음에 입력받은 num과 같다면 반복문 break
   if int(new_num) == int(start_num):
      break

   # for문 다시 돌 때 num에 new_num을 대입한 값이 오도록 해줌
   num = new_num

print(cycle)

이럴 바에 앞에 "0"은 왜붙여주는 거지..