[Python] 코딩 도장 - Reverse And Add

Updated:

코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.

코딩 도장에서 여러 문제를 확인할 수 있습니다.

난이도 순으로 차근차근 풀어보려 합니다.


[문제: Reverse And Add] - Lv.2

일단 어떤 수를 받아서 그 수를 뒤집은 다음 뒤집어진 수를 원래의 수에 더하는 과정을 뒤집어서 더하기라고 부르자.

그 합이 회문(palindrome, 앞뒤 어느 쪽에서 읽어도 같은 말이 되는 어구)이 아니면 회문이 될 때까지 이 과정을 반복한다.

예를 들어 처음에 195에서 시작해서 다음과 같이 네 번 뒤집어서 더하기를 반복하면 9339라는 회문이 만들어진다.

 195      786       1473      5214
+591     +687      +3741     +4125
----     -----     -----     -----
 786     1473       5214      9339

대부분의 정수는 이 방법을 몇 단계만 반복하면 회문이 된다(196 등 회문을 찾을 수 없는 경우도 있다).

어떤 수가 주어졌을 때 회문이 있으면 출력하고, 그 회문을 찾기까지 반복한 횟수를 출력하는 프로그램을 만들어야 한다.

사용되는 수는 모두 1,000번 미만 반복해서 회문을 찾을 수 있는 수고, 만들어진 회문을 4,294,967,295보다 크지 않다고 가정해도 된다.

Input

첫번째 줄에는 테스트 케이스를 나타내는 정수 N(0<N<=100)이 들어있고,

그 아래로 N개의 줄에 걸쳐서 회문을 구해야 하는 정수가 한 줄에 하나씩 들어있다.

Output

N개의 각 정수에 대해 회문을 발견하는 데 필요한 최소한의 반복 횟수를 출력하고, 스페이스를 한 칸 출력한 다음, 그 회문을 출력한다.

Sample Input

3
195
265
750

Sample Output

4 9339
5 45254
3 6666

출처: https://codingdojang.com/scode/432?answer_mode=hide


[풀이]

def Reverse_And_Add(n, i=0):
    if n == int(str(n)[::-1]):
        print(i, n)
    else:
        n = n + int(str(n)[::-1])
        Reverse_And_Add(n, i=i+1)
        
N = int(input())
n_lst = [int(input()) for i in range(N)]
    
for n in n_lst:
    Reverse_And_Add(n)
3
195
265
750
4 9339
5 45254
3 6666

회문이 될 때까지 반복 작업은 재귀 함수로 작성하였다.

작업 자체는 문자열로 바꾼 후 [::-1]로 뒤집어서 더하는 방식을 사용했다.

Input 형태와 Output 형태를 동일하게 맞추기 위해서 아래 코드를 조금 더 사용하였다.


[추천 풀이]

import math


def check_palindrome(str):
    for i in range(math.floor(len(str) / 2)):
        if str[i] != str[-i + -1]:
            return False
    return True


def reverse_and_add(n, in_num_str):
    try:
        if n < 1000:
            if check_palindrome(in_num_str):
                return print("%d %s" % (n, in_num_str))
            else:
                reverse_and_add(n + 1, str(int(in_num_str) + int(in_num_str[::-1])))
    except RecursionError:
        print("No palindrome within 1000 cycle")


how_many = int(input("How many numbers? "))
in_numbers = []

for i in range(how_many):
    in_numbers.append(input("Enter number: "))

for j in in_numbers:
    reverse_and_add(0, j)
How many numbers? 3
Enter number: 195
Enter number: 265
Enter number: 750
4 9339
5 45254
3 6666

재귀 함수를 사용한 것도 동일하고 전반적으로 비슷한데 1000 사이클 제한을 둔 것이 다르다.

예외 처리를 적용하셨는데 문제에 적혀 있으니 이런 방식으로 제한을 거는게 맞는 것 같다.

Leave a comment