1에서 10,000까지 정수 중에서 무작위 100개를 뽑아내어 출력하자. 

수학 문제 같은 접근이 맘에 들지 않는다면 실용적인 예로 바꿔 보자. 

음악 사이트에서 10,000개의 곡이 존재하는데 랜덤하게 100개의 곡을 뽑아 랜덤 듣기 서비스를 제공한다고 해보자. 물론 각 곡은 고유 인덱스를 가지며 반드시 1에서 10,000까지만의 연속된 정수라고 할 수도 없다. 예를 들면 34,483번 등의 곡도 존재할 수 있다. 어떻게 할 것인가? 

실제로 예전에 회사에 다닐 때 마주친 문제이다. 당시 회사에서는 음악 사이트 리뉴얼 중이었고, 랜덤 재생 버튼을 누르면 엄청나게 오랜 시간을 잡아 먹는 현상이 있었다. 코드를 보지는 않았지만, 모회사의 개발자 구하기 글의 첫번째 함수 비슷하게 구현하지 않았었을까 생각된다. 당시 이 소스를 작업하던 분이 배열 섞는데 시간이 너무 오래 걸린다고 좋은 방법을 알아봐 달라고 해서 배열을 섞는 함수를 찾아서 알려줬던 기억이 난다.[각주:1] 어쨌든, 이 문제를 접했을 때 이러한 접근이 당연했고 가장 적합한 처리 방법이었다.

요즘 테크니컬 면접을 준비하고, 알고리즘 수업도 듣다보니까 문제를 바라보는 관점이 조금 Y군처럼 바뀌었다. 이 문제를 접하자마자 어떻게 풀까 고민을 시작했고, 방법을 알아내었다.[각주:2] 이후 이 문제가 나왔던 위의 모회사의 개발자 구하기 글을 마져 읽어 내려가다 충격을 먹었다. 당연히 이렇게 푸는 설명이 있을 줄 알았는데, PHP상에서 배열을 섞어주는 shuffle 함수를 사용하는 것이 정답(?)으로 나와 있어서였다.

그냥, 책 제목으로 있는 '생각하는 프로그래머'와 '실용주의[각주:3] 프로그래머'라는 말이 떠올랐다. 흔히 학교에 있으면 '생각하는 프로그래머'가 되려고 노력하고, 회사에 있으면 '실용주의 프로그래머'가 되야할 것만 같다. 물론, 둘 다 잘해야 하지만 이 예를 보면 조금 아이러니한 느낌이 든다. 이상한 생각인가? ㅎㅎ 

뭔가 글을 잘 쓰지 못하는 게 티가 팍팍 나는
포스팅이다
포스팅이다. 
뭐, 결론은 한 가지 문제에 대한 두가지 접근 방식이 존재한다는 말이다. ^^;
  1. 시간은 기억은 미화시킨다. 과정이 정확하지는 않을 수 있다. [본문으로]
  2. 배열에 대상이 되는 수(1~10000)을 넣고, 랜덤 함수로 0~1 사이의 실수 값을 구해서 10000을 곱하여 나온 값을 index하는 값을 추출한다. 배열의 마지막 인자(e.g, 10000)를 그 index 값에 넣고 이제 다음 랜덤값에는 9999를 곱한다. 이런식으로... [본문으로]
  3. 책의 실제 내용과 관계없이 '실용주의'라는 단어의 의미만 가져다 썼음. [본문으로]
,