반응형
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
'Programming > Project Euler' 카테고리의 다른 글
[C/C++] 프로젝트 오일러 #34 : 자릿수의 팩토리얼 합(구현) (0) | 2015.04.13 |
---|---|
프로젝트 오일러 #33 : 약분하는 추가 숫자 (0) | 2015.04.13 |
31. 프로젝트 오일러 #31 : 코인들의 합 (0) | 2015.03.30 |
30. 프로젝트 오일러 #30 : 각 자릿수의 5승의 합 (0) | 2015.03.30 |
프로젝트 오일러 #29 서로 다른 n제곱 개수 (0) | 2015.03.07 |
댓글