구글(Google)의 R&D 센터가 한국에 생긴다. 조금이라도 IT나 인터넷, 프로그래밍.. 이런 이야기에 관심이 있는 사람이라면 이런 저런 이야기가 많이 듣거나 봤을 것이다. 구글의 사무실 분위기 사원 복지 정책 등을 보고 있자면 소프트웨어 엔지니어의 천국이라는 생각이 들 정도이다.
많은 사람들의 구글의 채용 정책에 관심이 많고.. 또 많은 언론에서 구글의 독특한 채용 방법을 기사에 올리고 있다. 그러던 중에 우연히 매일 경제에 포스트 된 기사를 볼 수 있었다. 구글의 입사 시험 문제 중에 하나 였는데 사무실 옆 자리에 있는 형이 관심을 갖고 있는걸 보고 나도 한번 보게 되었다.
해당 기사 보러 가기 (이곳을 누르면 해당 기사로 갈 수 있습니다.)
" 양수 n에 대해서 1과 n 사이에 1이 나오는 횟수를 나타내는 함수를 f(n)이라고 한다. 예를 들어 f(13)=6이다. f(n)=n이 되는 첫번째 양수는 1이다. 두번째 양수는 무엇인가. "
풀어서 이야기 하면 양수 N 까지의 숫자를 나열 했을때 1 이 들어간 수를 헤아리는데 양수 N까지의 1의 갯수가 양수 N과 동일한 두번째 값을 찾는 문제이다.
단순하게 N까의 루프에서 1의 숫자를 헤아리게 만든다면 P4 3G 라도 엄청난 시간이 걸린다. -_-
한번쯤 관심이 있다면 풀어 보자~
int N;
int Result;
int POW1, POW2, CNT;
N = 1; // 양수 N 시작
while( 1 ) {
++N;
POW1 = 10;
POW2 = 1;
Result = 0;
while( N >= POW1 ) {
Result += (N / POW1 + 1) * POW2;
if( ((N / POW2) % 10) < 1 ) --CNT;
POW2 = POW1;
POW1 *= 10;
}
if( N / POW2 == 1 )
Result += (N % POW2)+1;
if( N == Result )
break;
}
printf("The answer is %d",Result );
이 코드를 돌려보면 답은 199981이 나온다. 원래는 간단하다. N까지의 1의 숫자를 매번 헤아리는게 아닌 N까지의 숫자를 이용해서 1이 몇회 나오는데 자릿수 만큼의 루프를 통해서 찾아내는 방법으로 연산 횟수를 크게 줄이는 방식이다. N까지의 숫자를 나열했다고 치고 1의 자리수의 부터 N의 마지막 자릿수까지의 1의 출연 수를 계산해내는 방식으로 단순 처리 해보았다.
충분한 속도라 단순 등비 증가로 N에서 Result로 접근하지만 좀 더 가속 하고자 한다면 N과 f(N)은 사실상 계속 증가 할테니 N의 증가 폭을 2의 배수로 바꾸어 f(N)이 N을 넘게 되면 N/2 영역부터 중간점 찾기로 접근하면 연산수가 크게 줄 것 같다..;