더북(TheBook)

쿠폰 수집가 카드 한 벌이 있고 여러분이 카드를 하나씩 무작위로 뽑는다고 생각해보자. 모든 종류를 다 보기까지 카드를 몇 장이나 뽑아야 할까? 모든 숫자를 다 보기까지는 카드를 몇 장을 뽑아야 할까? 이 문제는 유명한 쿠폰 수집가 문제의 한 예이다. 트레이딩 카드 회사가 n가지의 트레이딩 카드를 만든다고 가정하자. 각각의 카드를 뽑을 확률이 동일하다고 가정하면 n가지 카드를 모두 보기까지 얼마나 많은 카드를 수집해야 할까?

▲ 그림 1.4.6 카드 컬렉션

 

[프로그램 1.4.2](couponcollector.py)는 이 과정을 시뮬레이션하면서 배열의 유용성을 잘 보여준다. 이 프로그램은 명령 줄 인수로 정수 n을 입력받고 random.randrange(0, n) 함수를 호출해 0에서 n-1 사이의 정수형 난수열을 생성한다([프로그램 1.3.8] 참조). 각 값은 카드를 나타내며, 우리는 그 값의 카드를 이미 봤는지 알아야 한다. 본 카드를 기억하기 위해 카드의 값을 인덱스로 사용하는 isCollected[] 배열을 사용한다. isCollected[i]의 값은 i 값의 카드를 봤다면 True, 아니면 False이다. 정수 value로 표현된 카드를 가져왔을 때는 isCollected[value] 값을 보면 그 카드를 이전에 봤는지 알 수 있다. 이 프로그램은 지금까지 본 새로운 값의 카드의 수와 생성된 전체 카드 수를 보관하면서, 새로운 값의 카드 수가 n이 되면 그때까지 생성된 카드 수를 출력한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.