정수가 하나 주어졌을 때, 이 숫자의 자릿수를 뒤집은 뒤 원래 수에 더하고, 그 결과가 회문(Palindrome)인지 확인하는 것이 이 글의 목표입니다. 만약 결과가 회문이 아니라면 갱신된 숫자로 동일한 과정을 반복하여 회문이 나올 때까지 진행합니다. 이 과정의 중단 조건은 최대 1000번의 반복, 혹은 long 타입의 최대값(Long.MAX_VALUE)보다 큰 값이 나오는 경우입니다.
예시
입력 − 1678
출력 − 주어진 입력 1678의 회문은 293392
설명 − 입력받은 숫자를 먼저 뒤집은 다음 원래 수에 더하고, 그 결과가 회문인지 검사합니다. 회문이 아니라면 갱신된 숫자로 동일한 과정을 반복합니다. 이 과정은 최대 1000번 반복하거나 long 타입 최대값(Long.MAX_VALUE)을 초과하면 종료됩니다.
입력 − 202021038
출력 − 주어진 입력 202021038의 회문은 1453553541
설명 − 마찬가지로 입력 숫자를 뒤집아 원래 수에 더한 뒤 회문 여부를 확인하고, 회문이 나오지 않으면 같은 과정을 계속 반복합니다. 중간에 결과값이 long 타입 최대값을 넘어서면 더 이상 유효한 범위 내에서 회문을 찾을 수 없습니다.
아래 프로그램에서 사용된 접근 방식
-
main 함수 내부
입력 숫자를 calculateReverseandAdd(input) 메서드에 전달합니다.
-
calculateReverseandAdd 메서드 내부
뒤집힌 숫자를 저장할 새로운 변수 rev_number를 선언합니다.
number <= max 조건을 만족하는 동안 루프를 반복합니다.
루프 안에서는 reverseNumber() 메서드를 호출하여 현재 숫자의 역순 값을 구합니다.
구한 뒤집힌 숫자를 원래 숫자에 더합니다.
결과 숫자를 checkPalindrome() 메서드에 전달하여 회문 여부를 검사하고, 회문이라면 그 숫자를 출력합니다.
회문이 아니라면 얻어진 숫자로 동일한 과정을 회문이 나올 때까지 반복합니다. 만약 결과 숫자가 long 타입 최대값보다 커지면 해당 입력에 대해 유효한 범위 내의 회문은 존재하지 않는 것으로 판단합니다.
예제 코드
import java.util.*;
public class ReverseAdd{
static final long max = Long.MAX_VALUE;
static long reverseNumber(long number){
long rev_number = 0;
while (number > 0){
rev_number = rev_number * 10 + number % 10;
number = number / 10;
}
return rev_number;
}
static boolean checkPalindrome(long number){
return (reverseNumber(number) == number);
}
static void calculateReverseandAdd(long number){
long rev_number = 0;
System.out.println("Palindrome of the given input " + number);
while (number <= max){
rev_number = reverseNumber(number);
number = number + rev_number;
if (checkPalindrome(number)){
System.out.println(number);
break;
}
else if (number > max){
System.out.println("No possible palindromes for the input");
}
}
}
public static void main(String[] args){
calculateReverseandAdd(1678);
calculateReverseandAdd(2961);
calculateReverseandAdd(202021038);
}
}
실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
Palindrome of the given input 1678 293392 Palindrome of the given input 2961 69696 Palindrome of the given input 202021038 1453553541