BLOG main image
분류 전체보기 (466)
Yuno (232)
Travel (130)
Culture (46)
Other (11)
Programming (17)
Picture (22)

[필리핀,마닐라] 그린벨트 (Gr..
월풍도원(月風道院) - Delight..
Tamiflu and parvo.
Tamiflu and side effects.
[미국,라스베가스] 라스베가스..
월풍도원(月風道院) - Delight..
[미국,라스베가스,그랜드캐년]..
월풍도원(月風道院) - Delight..
[태국,방콕]태국 숙소,방콕 -..
월풍도원(月風道院) - Delight..
«   2012/02   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      
1,476,207 Visitors up to today!
Today 44 hit, Yesterday 202 hit

'Google'에 해당되는 글 1건
[Yuno.org, 2006/10/12 17:56, Programming/Code Story]

구글(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 라도 엄청난 시간이 걸린다. -_-

한번쯤 관심이 있다면 풀어 보자~

<< 풀어본 답 열기 >>



--
alklid | 2006/10/12 22:23 | PERMALINK | EDIT/DEL | REPLY
ㅋ 전 못가겠네요..-_-;
superkkt | 2006/10/17 09:18 | PERMALINK | EDIT/DEL | REPLY
저는 이력서도 못내밀겠네요.. 도대체 뭔말이여~^^
xevious7 | 2006/10/20 23:32 | PERMALINK | EDIT/DEL | REPLY
유노님 포스트는 잘 보았습니다만 ,시험문제를 잘 풀려면 문제의 의도를 파악하는게 중요하다고
생각합니다. 이 문제의 의도는 다른데 있는 것 같습니다.
유노님의 코드는 유노님의 설명과 달리 어찌되었는 while 문 안에서 ++n 를 하기 때문에 n번의 수행이 필요합니다.
n번을 수행하는 코드는 대부분의 프로그래머가 쉽게 작성가능합니다.
그 안의 최적화하고 별도의 문제로 n번을 수행해야 합니다. 즉 복잡도가 n이라는 것입니다.
만약 100만번째 숫자였다면 100만번을 돌려야 하는 것이지요.
http://bbs.python.or.kr/viewtopic.php?t=22323 결국 이코드랑 비교하자면
유노님이 최적화 한부분은
1의 검색부분인데 , 이것은 이 시험문제가 의도한 것이 아닌 것 같습니다.
시험문제를 낸 사람이 원하는 것은 n번 돌리는 즉 복잡도 n의 프로그램을 원하는것이
아닌 것 같습니다.
복잡도 n 을 줄여나가는 것이 목표인것 같습니다.
적어도 마지막에 말한 좀더 가속하고자 하는 부분
의 라직을 다듬어 문제의 답을 작성하셔야 될듯 합니다. ~ 초면에 실례가 되었습니다만
도움이 도움이 되고자 적어보았습니다.
Yuno | 2006/10/21 00:13 | PERMALINK | EDIT/DEL
아아 xevious7님의 말씀이 맞습니다. 다만, 저 문제를 푸는 모습을 보고 x까지의 정수에서 1의 출연 횟수 구하는 방식을 줄여 보고자 했기 때문에 저 결과물이 나온겁니다~ ;

저 같은 경우는 간단한 방식으로 연산 횟수를 크게 줄여놨었습니다. shift 를 이용한 x값의 증감을 이용했는데 이는 x와 f(x)가 항상 동시에 증가 한다는 전제를 기준으로 작업을 했습니다만.. 퇴근시간이라 작성은 중단했습니다만-_-;

아무튼 조언 감사드립니다 ;)
xevious7 | 2006/10/21 11:00 | PERMALINK | EDIT/DEL | REPLY
아 그러셨군요 ~ ^^ 역시 ~ 좋은 주말되세요.
rotoRl | 2006/12/03 16:10 | PERMALINK | EDIT/DEL | REPLY
이거 프로그램 돌리면 199980 나오는데여???
답은 199981 인데 뭐가 잘못된건가여???
초보 | 2007/04/27 06:31 | PERMALINK | EDIT/DEL | REPLY
죄송합니다만 도움 좀 주세요. 설명이 이해가 안되요

#include <stdio.h>


void main()
{

int N=0,C=1,D;
int Result=0;

while(C)
{
N;
D=N;

while( D )
{
if( D % 10 == 1){
Result =1;
}

D = D / 10;
printf("M, M, M\n", N, Result, D);

}



if( N == Result
seobi | 2008/06/17 16:42 | PERMALINK | EDIT/DEL | REPLY
저도 한번 한시간동안 끙끙대며 문제 풀어 봤는데요..
아무리해도 복잡도를 줄이는건 이방법 왜엔 없는거 같네요..
제가 푼 방법은 간단히 첫번째 자리가 2~9일때는 1의 갯수가 증가하는 n을 추월할수가 없으니 첫번째 수가 2로 시작하면 바로 다음자리 10^n 으로 넘겨버립니다..
10^n 일때 1의 갯수는 쉽게 계산이 되더라구요..
소스는 좀더 다듬으면 줄어들긴 하겠지만 남이 보기엔 이게 가장 좋아 보이는군요..

사실 while문 안에
do {
if( jari_check%10 == 1 )
s_count++;
}while((jari_check = jari_check/10) > 0);
count += s_count;
이것만 있으면 끝인데 복잡도를 줄이려니 전체 소스가 길어지는군요..
어쨋든.. 구글~ 들어간사람들은 부럽삼...
int n = 0;
int count=0;
int s_count;
bool check;
int jari, jari_check;
while( n > count || n <= 1 ) { //1의 갯수가 n보다 같거나 클때까지..
jari_check = ++n;
check = false;
jari = 0;
s_count = 0;

do {
if( jari_check < 10 && jari_check == 1) //첫번째 자릿수가 1인지 여부 판단
check = true;
else //총 몇자리인지 판단
jari++;
if( jari_check%10 == 1 ) //현재 숫자에서 1이 몇개 있는지 판단하여 기존 count에 더함..
s_count++;
}while((jari_check = jari_check/10) > 0);

if( !check ) { //첫번째 자릿수가 1이 아닐때.. 즉 20, 200, 2000 될때 바로 100, 1000, 10000 으로 점프..
int k = 1;
int tmp_sum = 1;
int tmp_count = 0;
while( k < jari ) { // 1의 갯수.. 100에 21, 1000에 301, 10000에 4001
tmp_count = pow(10, k++ );
tmp_sum = ( tmp_count + (tmp_sum*10) );
}
n = pow(10, k);
count = tmp_sum+1;
}
else
count += s_count;
}
printf("Result f(%d) = %d\n",n,count);
Name
Password
Homepage
Secret
*1