MYWIZZBLOG

개발자 구하기

2006-03-31 12:52:18
올해 초부터 개발팀에서 병역특례로 개발자를 구하고 있는데요, 지금까지 스무번? 정도 면접을 본 것 같습니다.
좋은 사람과 일하고자 하는 욕구는 어디나 같은지라, 면접시 간단한 코딩 테스트를 하고 있는데요. (올해부터 처음 하는 것입니다^^;)

1시간 정도의 시간을 드리고 5문제 중에서 풀 수 있는 문제를 자신있는 언어로 푸는 방식입니다. 구글링하시라고 인터넷도 연결해 놓고요. (근데 대부분 네이버 지식인에서 검색하시더군요)
따끈따끈한 커피는 제가 대접해드리고요.

문제들은 "정상적인 개발 과정을 거친 분들이라면 쉽게 풀 수 있는" 기본적인 문제를 출제하는데요 (물론 출제자 기준입니다--;)
문자열이나 배열을 다룰 줄 아는가, 기초적인 DB 활용이 가능한가 등의..

그 중 한 문제를 오늘 얘기해보자면,

"1부터 27000 사이의 숫자 중에서 중복되지 않는 숫자 24000개를 무작위로 뽑아내어 출력하세요"

이렇게 간단하게 작성 가능한 문제를 내는 이유는
지원자가 작성한 코드를 가지고 3인의 면접관이, 더 효율적인 방법이 있는지 있다면 구현할 수 있는지를 테스트 후에 지원자분과 즐겁게 얘기해보기 위해서였습니다.
따라서

$result = array();
for ($i=0 ; $i<24000 ; $i++)
{
	do
	{
		$num = rand(1,27000);
	}
	while(in_array($num,$result));
	$result[] = $num;
}
echo implode("\n",$result);

위의 코드는 루프문에서 랜덤하게 숫자를 추출하기 때문에 이미 뽑아낸 수와 중복되는 경우가 많아지면서(in_array에 걸리는 경우) 갈수록 느려지는 코드입니다.

위와 같은 코드는 개선의 여지가 상당히 많기 때문에 지원자분에게 더 나은 방법을 모색해 보도록 할 수 있고, 그 과정에서 문제 해결의 능력을 볼 수 있기에 고마운 경우입니다만, 저런 코드라도 작성하신 분이 거의 없더군요.

어찌되었건 위의 코드는,

for ($i=1;$i<=27000;$i++)
	$buffer[$i] = $i;
	
shuffle($buffer);

for ($i=0;$i<24000;$i++)
	$result[] = $buffer[$i];

echo implode("\n",$result);

위와 같이 항상 동일한 반복 횟수를 보장하는 코드로 개선시킬 수 있습니다.
또한 코드상의 반복문을 제거하고 $buffer에 할당되는 데이터를 줄이려면 PHP의 풍부한 배열 관련 함수를 이용하여

$a = array_keys(array_fill(1,27000,true);
shuffle($a);
echo implode("\n",array_splice($a,0,24000));

위와 같이 작성할 수도 있습니다.

대부분의 지원자분들이 맞는 결과를 내놓지 못했다는 사실보다는,
테스트 후 같이 검토하는 자리에서조차 문제 해결 능력을 보여주지 못했다는 사실이 더 답답했습니다.
면접의 긴장감을 고려하더라도 말이죠.

...결론은, 병역특례 개발자를 뽑고 있으니 저와 일하고 싶으신 분은 메일을 ^^;
  • Wizz군의 블로그에서 신입사원 면접 문제에 대한 포스트를 읽었습니다. 사실 저 문제는, Jon Bently의 유명한 "Programming Pearls" (번역서 제목은 "생각하는 프로그래밍" 입니다.) 의 첫번째 예제로 나오는 정수 파일 정렬하기의 거꾸로 버전입니다. "1부터 27000 사이의 번호가 1번씩만 존재하는 파일이 있는데, 이 파일을 정렬하라. (단 파일에서 번호는 1번씩만 출현하고, 총 번호의 개수는 27000보다 작을 수 있다. 단, ..
    Leigh's Blog