본문 바로가기

CS/알고리즘 문제풀이

[백준/Python] 1110: 더하기 사이클

 문제 링크

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

 

1110번: 더하기 사이클

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

www.acmicpc.net


​ 접근 방법

문제를 잘 따라가면 접근 방법을 파악할 볼 수 있다.

문제의 예시처럼 26을 통해 접근방법을 생각해보자.

 

26은 10보다 크기 때문에 26이 유지된다. 각 자리수를 더해서 얻을 수 있는 수는 2+6 = 8이다.

그럼 새로 만들어지는 수는 26의 1의 자리수인 6과 각 자리수를 더해 얻은 8의 1의 자리수인 8이 붙여 68이 된다.

아직 68과 26은 같지 않다.

 

다시 68로 위 과정을 반복해 보자.

68은 10보다 크기 때문에 68이 유지된다. 각 자리수를 더해서 얻을 수 있는 수는 6+8=14이다.

새로 만들어지는 수는 68의 1의 자리수인 8과 각 자리수를 더해 얻은 14의 1의 자리수인 4를 붙여서 84가 된다.

아직 84는 26과 같지 않다.

 

다시 84로 반복해 보자.

84는 10보다 크기 때문에 84가 유지된다. 각 자리수를 더해서 얻을 수 있는 수는 8+4=12이다.

새로 만들어지는 수는 84의 1의 자리수인 4와 각 자리수를 더해 얻은 12의 1의 자리수인 2가 붙여서 42가 된다.

아직 42는 26과 같지 않다.

 

다시 42로 반복해 보자.

42는 10보다 크기 때문에 42가 유지된다. 각 자리수를 더해서 얻을 수 있는 수는 4+2=6이다.

새로 만들어지는 수는 42의 1의 자리수인 2와 각 자리수를 더해 얻은 6의 1의 자리수인 6이 붙여서 26이 된다.

26는 처음 입력받은 수인 26과 동일하다.

 

즉, 26은 4사이클 만에 다시 본인의 수로 돌아온 것이다.

 

처음 입력받은 수를 N이라고 할 때, (N%10)*10+(N//10 + N%10)%10 이 반복된다는 것을 알 수 있다.


​ 풀이

n = int(input())
cycle=1
new_num = (n%10)*10+(n//10 + n%10)%10
while True:
    if new_num == n:
        print(cycle)
        break
    else:
        new_num = (new_num%10)*10 + (new_num//10 + new_num%10)%10
        cycle+=1

비교를 위해 원래 수가 유지될 필요가 있기 때문에, 첫번째 사이클은 직접 계산을 해서 별도의 변수에 저장해 주었다.

cycle은 사이클을 수를 의미한다. 한번 계산을 하고 시작하기 때문에 1로 초기화했다.

이후 While loop를 통해 new_num과 입력값은 n이 동일해 질때까지 계산을 반복해준다.


​ 사족

간단한 문제인 만큼, 복잡하게 생각할 수록 자칫 딜레마에 빠질 수 있다.

단순하게 문제에서 제공한 힌트를 차근차근 따라가보자.

아무튼 도움이 되었길 바람-

 

'CS > 알고리즘 문제풀이' 카테고리의 다른 글

[Kotlin] 백준 2178 (ft. BFS)  (0) 2024.03.28
[백준/Python] 13909 창문 닫기  (2) 2023.10.17