[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