본문 바로가기
코드

회문 숫자 식별하기

by ehei 2012. 1. 14.

회문 숫자인지 알아내기 위해 숫자를 뒤집는 코드를 짜다가 밤을 새버렸네... 메타템플릿 버전을 짜려다 보니 이렇게 되버렸다. 후헐... 얼랭 책을 읽고 있는데, 덕분에 재귀에 빠져버렸다... ^^ 이러다 스택 오버플로 나야 정신을 >_<; 


1326487992_testReverse.cpp

  

// 메타 템플릿 버전. 당연히 초고속인데 리터럴 상수만 쓸 수 있는게 아쉽...

template< int input, int result >
struct ReverseMeta
{ enum { value = ReverseMeta< input / 10, result * 10 + input % 10 >::value }; };

 

template< int result >
struct ReverseMeta< 0, result >
{ enum { value = result }; };

 

template< int input, int result = 0 >
struct IsPalindromeMeta

{ enum { value = (input == ReverseMeta< input, result >::value) }; };

그리고 이건 재귀 버전 ^^

// 람다 재귀 버전. 어쨌든 템플릿이니까 그래도 좀 낫겠지

bool IsPalindrome(int input)
{
    const std::function< int(int, int) >func = [&func](int input, int result) -> int {
        const int quotient = input / 10;

        return 0 == quotient ? result * 10 + input : func(quotient, result * 10 + input % 10);
    };

 

    return input == func(input, 0);
}

압박 속에서 짠 단순 버전 -_-

bool IsPalindromeOld(int input)
{
    int array[20] = {};
    int* forwardPointer = array;
    int* backwardPointer = array + _countof(array) - 1;

 

    do 
    { 
        const int quotient = input % 10;
        *forwardPointer = quotient;
        ++forwardPointer;

        *backwardPointer = quotient;
        --backwardPointer;

        input /= 10;
    } while (0 < input);

 

    return 0 == memcmp(array, backwardPointer + 1, sizeof(*array) * (forwardPointer - array));
}

사용 예~

std::cout << IsPalindromeMeta< 56765 >::value << std::endl; // true, 앗싸
std::cout << IsPalindromeMeta< 0 >::value << std::endl; // true, ^o^

std::cout << IsPalindromeOld(3421)  << std::endl; // false, 후헐
std::cout << IsPalindromeOld(56765)  << std::endl; // true ^o^

'코드' 카테고리의 다른 글

다시 해본 동전 문제  (0) 2013.01.09
파이썬에서 A = [1,2,3]와 A[:] = [1,2,3]의 차이  (0) 2012.03.13
셀프 넘버들의 합 구하기  (0) 2012.01.14
던젼 생성 2/2  (0) 2010.08.16
던젼 생성 1/2  (0) 2010.08.06