주사위 게임 (python)

SeoYng·2020년 9월 6일
0

itertools.product 사용 (중복순열), 시뮬레이션

👀 깃헙 소스

문제설명
XX 모바일 보드게임은 같은 크기의 칸으로 구분된 직선 모양의 게임 보드와 특별한 주사위 3개를 사용해서 진행합니다. 주사위는 각각 1부터 S1, S2, S3까지의 숫자 중 하나가 나오며, 3개의 주사위를 동시에 굴려 나온 숫자의 합만큼 캐릭터를 이동시킵니다. 게임 보드의 몇몇 칸에는 몬스터가 있으므로, 캐릭터는 도착한 칸에서 몬스터를 만나게 될 수도 있습니다.
다음은 S1 = 2, S2 = 3, S3 = 4인 경우의 예시입니다.

위 그림에서 별은 캐릭터이며, 붉은 사각형은 몬스터입니다. 캐릭터는 1번 칸에 있습니다. 주사위를 던져 나온 숫자가 1, 1, 2라면 캐릭터는 총 4칸을 이동하여 5번째 칸에 도착해 몬스터를 만납니다. 반면에 주사위를 던져 나온 숫자가 2, 2, 1이라면 총 5칸을 이동한 캐릭터는 6번째 칸에 도착해 몬스터를 만나지 않습니다. 위 예시에서 주사위를 한 번만 굴렸을 때, 주사위 눈의 합만큼 이동해 도착한 칸에서 몬스터를 만나지 않을 확률은 0.5입니다.
몬스터의 위치를 담고 있는 배열 monster와 각 주사위에서 나올 수 있는 최대 숫자 S1, S2, S3가 매개변수로 주어질 때, 1번 칸에 위치한 캐릭터가 주사위를 한 번만 굴려 나온 눈금의 합만큼 이동해서 도착한 칸에 몬스터가 없을 확률을 return 하도록 solution 함수를 완성해 주세요. 단, return 값은 몬스터를 만나지 않을 확률에 1000을 곱한 후 소수부는 버리고 정수 부분만 return 하세요.

입출력 예

monster		S1	S2	S3	result
[4,9,5,8]	2	3	4	500
[4,9,5,8]	2	3	3	555

솔루션

서로 다른 주사위를 굴려 나올 수 있는 모든 경우의 합을 구한 후 보드위에 몬스터가 있는경우와 없는경우를 세서 확률을 구한다.

코드

# 파이썬
import itertools

def solution(monster, S1, S2, S3):

    MONSTER, SAFE = 0, 1
    it = itertools.product(range(1,S1+1), range(1,S2+1), range(1,S3+1))
    positions = [MONSTER if 1 + sum(s) in set(monster) else SAFE for s in it] 

    return int(positions.count(SAFE) / len(positions) * 1000)
profile
Junior Web FE Developer

0개의 댓글