이 글에서는 C++을 사용하여 숫자가 회문(palindrome)인지 확인하는 방법을 살펴보겠습니다. 회문 수란 앞에서부터 읽으나 뒤에서부터 읽으나 동일한 숫자를 의미합니다. 예를 들어 12321은 거꾸로 읽어도 12321이므로 회문이지만, 12345는 뒤집으면 54321이 되기 때문에 회문이 아닙니다.
핵심 로직은 매우 간단합니다. 주어진 숫자를 뒤집은 다음, 뒤집힌 숫자가 원래 숫자와 같은지 비교하면 됩니다. 두 값이 일치하면 회문이고, 그렇지 않으면 회문이 아닙니다. 그럼 알고리즘을 통해 자세히 살펴보겠습니다.
알고리즘
isPalindrome(n) −
입력 − 판별할 숫자 n
출력 − 숫자가 회문이면 true, 아니면 false
begin
temp := n
rev := 0
while n > 0, do
rev := rev * 10 + (n mod 10)
n := n / 10
done
if rev = temp, then
return true
return false
end
동작 원리
각 반복마다 현재 숫자의 마지막 자릿수(n mod 10)를 추출하여 결과 변수 rev의 뒤에 붙입니다. 그다음 n을 10으로 나누어 마지막 자릿수를 제거합니다. 이 과정을 n이 0이 될 때까지 반복하면 rev에는 원래 숫자가 뒤집힌 값이 저장됩니다.
C++ 구현 예제
#include <iostream>
using namespace std;
bool isPalindrome(int number) {
int temp = number;
int rev = 0;
while(number > 0){
rev = 10 * rev + number % 10; // 마지막 자릿수를 추출해 뒤집힌 숫자에 붙임
number /= 10;
}
if(rev == temp)
return true;
return false;
}
int main() {
int n = 12321;
if(isPalindrome(n)){
cout << n << " is palindrome number";
} else {
cout << n << " is not a palindrome number";
}
}
실행 단계 예시 (n = 12321)
- 1단계: rev = 0 × 10 + 1 = 1, number = 1232
- 2단계: rev = 1 × 10 + 2 = 12, number = 123
- 3단계: rev = 12 × 10 + 3 = 123, number = 12
- 4단계: rev = 123 × 10 + 2 = 1232, number = 1
- 5단계: rev = 1232 × 10 + 1 = 12321, number = 0
반복이 종료된 후 rev(12321)와 temp(12321)가 일치하므로, 이 숫자는 회문임을 알 수 있습니다.
출력
12321 is palindrome number
참고 사항: 이 방법은 양의 정수를 기준으로 동작합니다. 음수는 while 조건(n > 0)을 만족하지 못해 항상 회문이 아니라고 판정됩니다. 또한 자릿수가 매우 큰 숫자를 뒤집을 때 int 범위를 초과할 수 있으므로, 필요하다면 long long 타입을 사용하는 것이 안전합니다.