본문 바로가기
Programming/Project Euler

32. 프로젝트 오일러 #32 : 팬디지털 곱

by 작은별하나 2015. 4. 13.
반응형

32번 문제는 어려움 정도가 5%라 상당히 난이도가 낮은 문제네요.


이 문제는 일단 다음과 같은 접근을 생각했습니다.


어떤 수 n이 있습니다.  이 수에 대한 약수를 구합니다.  그러면 두 수를 구할 수 있겠죠.  그러면 이 수에 대해서 팬디지털인지 검사하면 됩니다.


두 수를 먼저 만든 후 곱하는 것보다는 하나의 수에 대해서 인수분해를 하는 것이 복잡도가 덜하겠다는 생각이 들더라고요.


팬디지털을 검사하는 로직은 일단 간단하게 했습니다.  사실 이 부분이 제일 핵심이기도 하고요.  팬디지털은 비트플래그를 이용합니다. 비트플래그에 중복이 생기면 팬디지털이 아닌 것이 되고요.  모두 다 체크되었다면 완벽하게 팬디지털이 되겠죠.


팬디지털인지 검사하기 위해서 검사하는 로직은 다음과 같습니다.

첨부된 소스는 참고용으로만 봐주세요.


inline bool Check(int &k, int q)
{
    while( q )
    {
        int c = q%10;
        if( c == 0 || (k & (1<<c)) ) return false;
        k |= 1<<c;
        q /= 10;
    }
    return true;
}

Check 작업이 완료되면, 마지막에는 비트플래그가 0x3fe 라면 팬디지털이 완성됩니다.


728x90

댓글