회문(Palindrome) 숫자란?
회문 숫자는 숫자의 자릿수를 거꾸로 뒤집어도 원래 값과 동일하게 유지되는 수를 말합니다. 대표적인 예로 121, 1331, 12321 등이 있으며, 1221을 뒤집어도 그대로 1221이므로 회문 숫자에 해당합니다.
C 언어에서는 while 루프를 활용하면 사용자가 입력한 양의 정수가 회문 숫자인지 아닌지 손쉽게 판별할 수 있습니다. 핵심 원리는 숫자를 한 자리씩 분리한 뒤 역순으로 조립하고, 그 결과를 원래 숫자와 비교하는 것입니다.
예제 1: while 루프로 숫자 회문 판별하기
다음은 while 루프를 사용하여 회문 숫자를 찾는 C 프로그램입니다.
#include <stdio.h>
int main(){
int num, temp, rem, rev = 0;
printf("enter a number:\n");
scanf("%d", &num);
temp = num;
while ( temp > 0){
rem = temp %10;
rev = rev *10+ rem;
temp = temp /10;
}
printf("reversed number is = %d\n", rev);
if ( num == rev )
printf("\n%d is Palindrome Number.\n", num);
else
printf("%d is not the Palindrome Number.\n", num);
return 0;
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
enter a number: 1234 reversed number is = 4321 1234 is not the Palindrome Number. enter a number: 1221 reversed number is = 1221 1221 is Palindrome Number.
동작 원리 살펴보기
- rem = temp % 10; — 나머지 연산자(%)를 이용해 현재 숫자의 마지막 자릿수를 추출합니다.
- rev = rev * 10 + rem; — 기존에 만든 역순 숫자를 한 자리 왼쪽으로 밀고 새 자릿수를 덧붙여 뒤집힌 숫자를 완성합니다.
- temp = temp / 10; — 정수 나눗셈으로 마지막 자릿수를 제거하며, temp가 0이 되면 루프가 종료됩니다.
루프가 끝난 후 num == rev 조건으로 원래 숫자와 뒤집힌 숫자를 비교하여 회문 여부를 최종 판정합니다.
예제 2: while 루프로 문자열 회문 판별하기
while 루프는 숫자뿐만 아니라 문자열에도 적용할 수 있습니다. 다음 예제에서는 문자열의 시작 인덱스(i)와 끝 인덱스(length)를 서로 마주 보게 이동시키면서 각 위치의 문자를 비교하는 방식으로 회문 여부를 검사합니다.
#include <stdio.h>
#include <string.h>
void pal(char string[]);
int main(){
char string[100];
printf("enter a string: ");
gets(string);
pal(string);
return 0;
}
void pal(char string[]){
int i = 0;
int length = strlen(string) - 1;
while (length > i){
if(string[i++] != string[length--]){
printf("\n %s is not a palindrome", string);
return;
}
}
printf("\n %s is a palindrome string", string);
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
enter a string: tutorial tutorial is not a palindrome enter a string: saas saas is a palindrome string
마무리
이처럼 while 루프 하나만으로도 숫자형 회문과 문자열 회문을 모두 판별할 수 있습니다. 숫자의 경우 나눗셈과 나머지 연산으로 자릿수를 조작하고, 문자열의 경우 양쪽 끝에서 중앙으로 인덱스를 이동시키며 비교한다는 점이 두 접근 방식의 핵심 차이입니다. 참고로 실무 코드에서는 버퍼 오버플로 위험이 있는 gets() 대신 fgets()나 scanf() 사용을 권장합니다.