우당탕탕 파이썬 with 하루하나 알고리즘

백준 1110 파이썬 - 더하기 사이클

hyxndy 2022. 3. 25. 14:01

백준 1110번 - 더하기 사이클 with python

Q. 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의 사이클 길이를 출력한다.

https://www.acmicpc.net/problem/1110

 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net


일단 갑자기 브론즈1 문제를 풀게 돼서 살짝 겁먹었다..!!!

그리고 기존에 풀었던 문제들은 전부 제한시간 1초문제였는데

이문제는 2초나 준다고 해서 진짜 걱정 of 걱정 of 걱정..

그래서 먼저 문제를 이해하는 데 시간을 꽤 투자하였다.

 

처음에 했던 생각은

숫자를 문자열로 받아들인 후, list형으로 만들어 각 단위별로 쪼개고(68이면 6과 8로)

if문을 활용하여 여러가지 경우의 수를 각각 처리해주려고 했었다.

근데 뭔가 하면 할수록 코드가 복잡해지고 뭔가 산으로 가는 느낌이 들어 잠시 구글링을 참고했다..

 

구글링을 통해 다른 사람들의 풀이를 딱 한 줄!!만 봤다 진심

그 한 줄을 통해 많은 것을 얻을 수 있었다. 바로 각 단위별로 쪼개는 데에는 다른 방법이 있다는 것이다.

이것을 알고 나서 나머지도 술술 풀 수 있게 되었다.

 

정수를 각 단위별로 나누려면 몫과 나머지를 이용하면 된다.

두자리 정수일 때, 10으로 나눈 몫은 10의 자리에 해당하는 값이 되고,

10으로 나눈 나머지는 일의 자리에 해당하는 값이 된다.

 

예를 들어, 68을 10으로 나누었을 때 몫은 6이고, 나머지는 8이다.

또한, 가장 오른쪽 자리수는 일의 자리를 의미하니깐 10으로 나눈 것의 나머지라고 생각해주면 된다.

 

이를 통해 코드를 생성해주면

A=int(input())
int_A=A
sum=0

while True:
    a = A // 10
    b = A % 10
    c = (a + b) % 10
    A = int(str(b)+str(c))
    sum+=1
    if (int_A==A):
        break
print(sum)

이와 같은 코드를 만들어줄 수 있다.

sum 변수를 통해 반복횟수를 저장시켜 주었다.