팰린드롬 숫자는 앞뒤로 읽어도 동일한 숫자입니다. 아래는 C 언어를 사용해 숫자가 팰린드롬인지 확인하는 5가지 방법으로, 코딩 테스트 준비에 유용합니다.
방법 1: 숫자 반전
숫자의 각 자릿수를 추출해 전체 숫자를 반전시킨 후 원래 숫자와 비교합니다.
#include <stdio.h>
int isPalindrome(int num) {
if (num < 0) return 0;
long long reversed = 0, original = num;
while (num > 0) {
reversed = reversed * 10 + num % 10;
num /= 10;
}
return reversed == original;
}
int main() {
int num = 12321;
printf("%d는 %s\n", num, isPalindrome(num) ? "팰린드롬입니다" : "팰린드롬이 아닙니다");
return 0;
}
방법 2: 문자열로 변환
숫자를 문자열로 변환한 후 양쪽 끝에서부터 문자를 비교합니다.
#include <stdio.h>
#include <string.h>
int isPalindrome(int num) {
if (num < 0) return 0;
char str[20];
sprintf(str, "%d", num);
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
if (str[i] != str[len - 1 - i]) return 0;
}
return 1;
}
int main() {
int num = 12321;
printf("%d는 %s\n", num, isPalindrome(num) ? "팰린드롬입니다" : "팰린드롬이 아닙니다");
return 0;
}
방법 3: 자릿수 배열 사용
자릿수를 배열에 저장한 후 양쪽 끝에서 비교합니다.
#include <stdio.h>
int isPalindrome(int num) {
if (num < 0) return 0;
int digits[20], count = 0;
while (num > 0) {
digits[count++] = num % 10;
num /= 10;
}
for (int i = 0; i < count / 2; i++) {
if (digits[i] != digits[count - 1 - i]) return 0;
}
return 1;
}
int main() {
int num = 12321;
printf("%d는 %s\n", num, isPalindrome(num) ? "팰린드롬입니다" : "팰린드롬이 아닙니다");
return 0;
}
방법 4: 재귀적 접근
재귀를 사용해 첫 번째와 마지막 자릿수를 비교하고, 각 단계에서 숫자를 줄여갑니다.
#include <stdio.h>
#include <math.h>
int getDigitCount(int num) {
if (num == 0) return 1;
return (int)log10(num) + 1;
}
int isPalindromeHelper(int num, int digits) {
if (digits <= 1) return 1;
int first = num / (int)pow(10, digits - 1);
int last = num % 10;
if (first != last) return 0;
num = (num % (int)pow(10, digits - 1)) / 10;
return isPalindromeHelper(num, digits - 2);
}
int isPalindrome(int num) {
if (num < 0) return 0;
return isPalindromeHelper(num, getDigitCount(num));
}
int main() {
int num = 12321;
printf("%d는 %s\n", num, isPalindrome(num) ? "팰린드롬입니다" : "팰린드롬이 아닙니다");
return 0;
}
방법 5: 자릿수 직접 비교
숫자를 완전히 반전시키거나 저장하지 않고 양쪽 끝 자릿수를 직접 비교합니다.
#include <stdio.h>
#include <math.h>
int isPalindrome(int num) {
if (num < 0) return 0;
int digits = (num == 0) ? 1 : (int)log10(num) + 1;
for (int i = 0; i < digits / 2; i++) {
int left = (num / (int)pow(10, digits - 1 - i)) % 10;
int right = (num % (int)pow(10, i + 1)) / (int)pow(10, i);
if (left != right) return 0;
}
return 1;
}
int main() {
int num = 12321;
printf("%d는 %s\n", num, isPalindrome(num) ? "팰린드롬입니다" : "팰린드롬이 아닙니다");
return 0;
}
각 방법은 메모리 사용량, 시간 복잡도, 코드 단순성 측면에서 장단점이 있습니다. 코딩 테스트 요구사항에 가장 적합한 방법을 선택하세요!
댓글
댓글 쓰기