[프로그래머스 코딩테스트]Level 02 - 주사위 게임

2 minute read

Level 02 - 주사위 게임

문제 설명

XX 모바일 보드게임은 같은 크기의 칸으로 구분된 직선 모양의 게임 보드와 특별한 주사위 3개를 사용해서 진행합니다. 주사위는 각각 1부터 S1, S2, S3까지의 숫자 중 하나가 나오며, 3개의 주사위를 동시에 굴려 나온 숫자의 합만큼 캐릭터를 이동시킵니다. 게임 보드의 몇몇 칸에는 몬스터가 있으므로, 캐릭터는 도착한 칸에서 몬스터를 만나게 될 수도 있습니다.
캐릭터는 1번 칸에 있습니다. 주사위를 던져 나온 숫자가 1, 1, 2라면 캐릭터는 총 4칸을 이동하여 5번째 칸에 도착해 몬스터를 만납니다. 반면에 주사위를 던져 나온 숫자가 2, 2, 1이라면 총 5칸을 이동한 캐릭터는 6번째 칸에 도착해 몬스터를 만나지 않습니다. 위 예시에서 주사위를 한 번만 굴렸을 때, 주사위 눈의 합만큼 이동해 도착한 칸에서 몬스터를 만나지 않을 확률은 0.5입니다.
몬스터의 위치를 담고 있는 배열 monster와 각 주사위에서 나올 수 있는 최대 숫자 S1, S2, S3가 매개변수로 주어질 때, 1번 칸에 위치한 캐릭터가 주사위를 한 번만 굴려 나온 눈금의 합만큼 이동해서 도착한 칸에 몬스터가 없을 확률을 return 하도록 solution 함수를 완성해 주세요. 단, return 값은 몬스터를 만나지 않을 확률에 1000을 곱한 후 소수부는 버리고 정수 부분만 return 하세요.

제한 사항

  • monster는 몬스터의 위치를 담은 배열이며 길이(몬스터의 개수)는 1 이상 99 이하입니다.
  • monster의 각 원소는 현재 몬스터의 위치를 나타내며, 모든 몬스터의 위치는 2 이상 100 이하의 자연수입니다.
  • 같은 위치의 몬스터가 여러 번 중복해서 주어지지 않으며, 한 칸에는 한 마리의 몬스터만 있습니다.
  • 각 주사위를 던져 나올 수 있는 수의 최댓값 S1, S2, S3는 다음과 같습니다.
    • 2 ≤ S1 ≤ 30, 2 ≤ S2 ≤ 30, 2 ≤ S3 ≤ 40, S1, S2, S3는 자연수
  • 몬스터를 만나지 않을 확률에 1000을 곱한 후 소수부는 버리고 정수 부분만 int형으로 return 해주세요.

입출력 예

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

def solution(monster, S1, S2, S3):
    meet = 0 # 몬스터를 만날때마다 카운트 증가
    total = 0 # 주사위를 던져서 나올 수 있는 모든 경우의 수
    S1_list = [i for i in range(1, S1+1)] # S1에서 나올 수 있는 모든 주사위 값
    S2_list = [i for i in range(1, S2+1)] # S2에서 나올 수 있는 모든 주사위 값
    S3_list = [i for i in range(1, S3+1)] # S3에서 나올 수 있는 모든 주사위 값
    for i in product(S1_list, S2_list, S3_list): # S1, S2, S3의 주사위값의 중복순열을 구한다. 
        # print(i, end=" ")
        total += 1 # 매 경우마다 총 카운트 증가
        if sum(i)+1 in monster: # 만약 주사위 값만큼 전진했을때 몬스터를 만나면
            meet += 1
            # print(i)
    # print(meet, total)
    answer = int((1 - (meet/total))*1000)
    return answer

print(solution([4,9,5,8],2,3,4))#500

중복 순열을 이용해서 완전탐색으로 풀었다. 파이썬에서 중복순열을 쓰는 방법 : https://juhee-maeng.tistory.com/91

Categories:

Updated: