문제
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의 사이클 길이를 출력한다.
풀이
import sys
n = int(sys.stdin.readline())
new = -1
num = n
count = 0
while(new != n):
# 두자리 수의 경우, 각 자릿수의 합을 구한다.
if num >= 10:
sum = num//10+num % 10
new = num % 10*10+sum % 10
# 한자리 수의 경우, 각 자릿수의 합은 num이다.
else:
new = num % 10*10+num
num = new
count += 1
print(count)
생각
보통 result 값을 초기화할 때 0을 많이 사용하는데, 이 문제에서는 new=0으로 초기화를 하면, n의 input이 0일 때 오류가 발생했다.
new=0일 경우 while문의 조건이 성립하지 않아 count가 0으로 끝난다.
따라서 숫자를 초기화할 때 입력값의 범위를 살펴보고, -1 등으로.. 영향이 없게 초기화를 해줘야겠다.
+ 또 다른 방법은, while(조건) 대신, while(True): if(조건): break.. 이렇게 쓰면 조건이 안맞더라도 cnt를 추가해줄 수 있다.
근데 브론즈3이랑 브론즈1이랑 레벨차이가 없는 것 같은데 원래 이런건가? ㅎㅎ 실버1까지 레벨차이가 안느껴졌으면 좋겠다 ^_^..
'👩🏻💻 Front-end > 👾 Algorithm' 카테고리의 다른 글
백준 4344 - 평균은 넘겠지 (Python) (0) | 2022.05.01 |
---|---|
백준 4884 - FIFA 월드컵 (Python) (0) | 2022.04.24 |
백준 1032 - 명령 프롬프트 (Python) (0) | 2022.04.23 |
백준 1598 - 꼬리를 무는 숫자 나열 (직각거리 구하기) (Python) (0) | 2022.04.20 |
백준 1267 - 핸드폰 최소 요금제 구하기 (Python) (0) | 2022.04.20 |