[BOJ] Q17825 주사위 윷놀이

Question

Language: Python

Difficulty: Gold 3~4

위의 문제는 주어진 윷놀이판에 대한 이동 규칙을 리스트로 변환할 수 있으면 된다.

–> 노드에 대해 index으로 부여해서, directory 형태로 관리하면 된다.

그리고 각각의 말에 대해서, bruteforce를 통해서 주사위를 이동시켜보면서 얻을 수 있는 최대값을 구하면 된다.

from copy import deepcopy
def move(start_location,amount):
    conversion={start:[i for i in range(start+1,start+6)] for start in range(18)}
    conversion[17]=[18,19,20,21,21]
    conversion[18]=[19,20,21,21,21]
    conversion[19]=[20,21,21,21,21]
    conversion[20]=[21,21,21,21,21]
    conversion[5]=[22,23,24,25,31]
    conversion[10]=[26,27,25,31,32]
    conversion[15]=[28,29,30,25,31]
    conversion[22]=[23,24,25,31,32]
    conversion[23]=[24,25,31,32,20]
    conversion[24]=[25,31,32,20,21]
    conversion[25]=[31,32,20,21,21]
    conversion[26]=[27,25,31,32,20]
    conversion[27]=[25,31,32,20,21]
    conversion[28]=[29,30,25,31,32]
    conversion[29]=[30,25,31,32,20]
    conversion[30]=[25,31,32,20,21]
    conversion[31]=[32,20,21,21,21]
    conversion[32]=[20,21,21,21,21]

    return conversion[start_location][amount]

def check_if_horse_exists(expected_location,horses,horse_index):
    for index in range(4):
        if index == horse_index:
            continue

        if horses[index]==expected_location:
            return True
    return False

def dfs(cnt,horses,result):
    global max_result
    
    if cnt==10:
        max_result=max(max_result,result)
        return

    for horse_index in range(4):
        if horses[horse_index] == 21:
            continue
        new_location=move(horses[horse_index],dices[cnt]-1)
        #도착 칸에는 여러개의 말이 있을 수 있다.
        if new_location ==21 or not check_if_horse_exists(new_location,horses,horse_index):
            temp=deepcopy(horses)
            temp[horse_index]=new_location
            dfs(cnt+1,temp,result+graph[new_location])

if __name__ == "__main__":
    max_result=0
    graph=[0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,0,13,16,19,25,22,24,28,27,26,30,35]
    dices=list(map(int,input().split()))
    
    dfs(0,[0,0,0,0],0)
    print(max_result)

댓글남기기