2023. 2. 9. 18:13ㆍ백준/파이썬
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"은 왜붙여주는 거지..
'백준 > 파이썬' 카테고리의 다른 글
[ 백준 문제 11720 / 파이썬 ] 숫자의 합 (0) | 2023.02.09 |
---|---|
[ 백준 문제 11654 / 파이썬 ] 아스키 코드 (1) | 2023.02.09 |
[ 백준 문제 4673 / 파이썬 ] 셀프 넘버 (0) | 2023.02.09 |
[ 백준 문제 15596 / 파이썬 ] 정수 N개의 합 (0) | 2023.02.09 |
[ 백준 문제 4344 / 파이썬 ] 평균은 넘겠지 (0) | 2023.02.09 |