보물창고 블로그

백준 알고리즘 17825번 주사위 윷놀이 풀이 With Python 본문

알고리즘 풀이/백준 알고리즘

백준 알고리즘 17825번 주사위 윷놀이 풀이 With Python

홋 메 2020. 3. 10. 13:52
728x90

문제 링크: https://www.acmicpc.net/problem/17825

 

17825번: 주사위 윷놀이

주사위 윷놀이는 다음과 같은 게임판에서 하는 게임이다. 가장 처음에는 시작에 말 4개가 있다. 말은 게임판에 적힌 화살표의 방향대로만 이동할 수 있다. 파란색 칸에서 말이 이동을 시작하는 경우에는 파란색 화살표의 방향으로 이동해야 하며 파란색 칸을 지나가는 경우에는 빨간 화살표의 방향대로 이동해야 한다. 게임은 1부터 5까지 한 면에 하나씩 적혀있는 5면 주사위를 굴려서 나온 수만큼 이동하는 방식으로 진행한다. 이동하려고 하는 칸에 말이 이미 있는 경우에

www.acmicpc.net

문제는 아래와 같습니다.

막상 문제를 구현하려고 하였을 때 어떻게 해야 할지 막막하였다. 결국 다른 사람들의 풀이를 보았고, 윷놀이 판을 리스트로 구현하였다. 상당히 애를 먹었던 문제다. 풀이는 아래와 같다. DFS(깊이 우선 탐색)을 사용하였고, 백 트레킹을 하여 9번째 주사위에서 현재의 정답에 40을 더한 값보다 작으면 종료시켜서 불필요한 연산을 줄이려고 노력하였다.

import sys


def solution(count, sub, position):
    global answer
    if count == 9 and answer != 0:
        if sub + 40 < answer:
            return
    elif count == 10:
        if answer < sub:
            answer = sub
        return
    for i in range(4):
        x, y = position[i]
        if x == 4 and y == 4:
            continue
        nx, ny = position[i]
        if x == 0:
            if y == 5:
                nx = 1
                ny = -1
            elif y == 10:
                nx = 2
                ny = -1
            elif y == 15:
                nx = 3
                ny = -1
            elif y == 20:
                nx = 4
                ny = 3
        ny += dices[count]
        if nx == 0 and ny >= 20:
            nx = 4
            if ny == 20:
                ny = 3
            else:
                ny = 4
        elif 0 < nx < 4 and ny > len(map1[nx]) - 1:
            ny -= len(map1[nx])
            nx = 4
        elif nx == 4 and ny > 4:
            ny = 4
        if map1[nx][ny] != 0 and [nx, ny] in position:
            continue
        position[i] = [nx, ny]
        solution(count + 1, sub + map1[nx][ny], position)
        position[i] = [x, y]


answer = 0
dices = list(map(int, sys.stdin.readline().split()))
map1 = [
    [],
    [13, 16, 19],
    [22, 24],
    [28, 27, 26],
    [25, 30, 35, 40, 0]
]
for i in range(21):
    map1[0].append(2 * i)
stack = [[0, 0, [[0, 0] for _ in range(4)], [0] * 4]]
solution(0, 0, [[0, 0] for _ in range(4)])
print(answer)
Comments