9일차 문제

양진혁·2021년 11월 9일
0

문제풀이

오늘 총 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을 없으면 빈 집합에 수를 추가하는 코드이다.

0개의 댓글