오늘 총 2문제를 풀었다.
첫번째 문제는 5kyu 난이도 문제로
rolldice_sum_prob(11, 2) == 0.0555555555 # or 1/18
rolldice_sum_prob(8, 2) == 0.13888888889# or 5/36
rolldice_sum_prob(8, 3) == 0.0972222222222
첫번째 매개변수는 숫자의 합 두번째 매개변수는 주사위 숫자이다.
주사위 2개에서 11이 나올 확률은 (5,6),(6,5)가 있기 때문에
2/36 = 1/18이 나온다.
import itertools def rolldice_sum_prob(sum_, dice_amount): if sum_ < dice_amount or sum_>6*dice_amount: return 0 emptylist = [] sum_list = list(itertools.product(range(1,7),repeat=dice_amount)) for i in sum_list: if sum(i) == sum_: emptylist.append(i) return float(len(emptylist))/6**dice_amount
조합과 순열을 계산하는데 편리한 itertools를 사용했다.
먼저 수의 합이 주사위 개수보다 작거나 수의 합이 주사위 최대수인 6 * 개수 보다 많은 경우 0을
나머지의 경우 itertools.product를 사용해서 1,7의 모든 순열을 그리고 repeat을 써서 주사위의 숫자만큼 반복시켰다.
그 다음 sum()을 사용해서 i의 합이 첫번째 매개변수와 크기가 같을때 빈 리스트에 추가하는 식으로 했다.
두번째 문제 난이도는 5kyu로
sum_pairs([11, 3, 7, 5], 10)
== [3, 7]
즉 합이 10이 되는 수를 뽑는 것이다. 만약 중복이 걸릴 경우 순서가 빠른 순으로 정렬하면 된다.
def sum_pairs(ints, s): setints = set() for n in ints: d = s - n if d in setints: return [d, n] setints.add(n)
set() 집합 함수를 사용해서 중복을 제거하고 s에서 list 내 숫자를 빼준 후 그 숫자가 존재하면 return을 없으면 빈 집합에 수를 추가하는 코드이다.