알고리즘 문제 풀이

133. [삼성기출29]Python 백준 17825 번 주사위 윷놀이

코딩하는 덕구 🐶 2023. 7. 8. 21:47
728x90

안녕하세요 코딩하는 덕구입니다.

백준 17825 주사위 윷놀이 입니다.

https://www.acmicpc.net/problem/17825

 

17825번: 주사위 윷놀이

첫째 줄에 주사위에서 나올 수 10개가 순서대로 주어진다.

www.acmicpc.net

 

백준 17825 주사위 윷놀이 정답코드 입니다. 설명은 아래에 있습니다.

 

order = list(map(int, input().split()))
board = [
    [1], #시작
    [2], [3], [4], [5], [6, 21],
    [7], [8], [9], [10], [11, 27],
    [12], [13], [14], [15], [16, 29],
    [17], [18], [19], [20], [32],
    [22], [23], [24], [25], [26], [20],
    [28], [24],
    [30], [31], [24],
    [32] #도착
]
score = [0,
         2, 4, 6, 8, 10,
         12, 14, 16, 18, 20,
         22, 24, 26, 28, 30,
         32, 34, 36, 38, 40,
         13, 16, 19, 25, 30, 35,
         22, 24,
         28, 27, 26,
         0
         ]

ans = 0
def dfs(piece, depth, res):
    if depth >= 10:
        global ans
        ans = max(ans, res)
        return

    for i in range(4):
        x = piece[i]

        if len(board[x]) == 2:
            x = board[x][1]
        else:
            x = board[x][0]

        for _ in range(1, order[depth]):
            x = board[x][0]

        if (x not in piece) or x == 32:
            before = piece[i]
            piece[i] = x
            dfs(piece, depth + 1, res + score[x])
            piece[i] = before

dfs([0, 0, 0, 0], 0, 0)
print(ans)

 

문제 접근

1. 말이 이동가능한 윷놀이 판을 구현합니다.

2. 주사위 순서대로 말의 모든 조합을 시도해보면 됩니다.

이때 중복되는 계산을 줄이기 위해 dfs를 사용합니다.

 

 

Python 코드 구현

먼저 윷놀이 판 입니다.

윷놀이 판의 모든 성분은 이동 가능한 다음 index를 갖고있습니다.

도착하게되면 더 이상 움직이면 안되므로 본인의 index를 성분으로 갖습니다.

board = [
    [1], #시작
    [2], [3], [4], [5], [6, 21],
    [7], [8], [9], [10], [11, 27],
    [12], [13], [14], [15], [16, 29],
    [17], [18], [19], [20], [32],
    [22], [23], [24], [25], [26], [20],
    [28], [24],
    [30], [31], [24],
    [32] #도착
]

 

 다음은 점수입니다.

윷놀이판의 index에 대응하여 점수를 성분으로 가집니다.

score = [0,
         2, 4, 6, 8, 10,
         12, 14, 16, 18, 20,
         22, 24, 26, 28, 30,
         32, 34, 36, 38, 40,
         13, 16, 19, 25, 30, 35,
         22, 24,
         28, 27, 26,
         0
         ]

 

 모든 경우의 수를 시도할 dfs입니다.

depth가 10이 넘어가면 점수를 계산하고 종료합니다.

아니라면 4개의 말을 순서대로 선택한 후파란색 위치인지 확인한 후 해당 조건에 맞게 주사위를 굴려 말을 이동시킵니다.이동한곳에 중복되는 말이 없거나, 말이 도착하면 주사위의 다음 순서를 시도합니다.또한 주사위의 현재 순서를 다음 말에 적용하여 이동시킵니다.
def dfs(piece, depth, res):
    if depth >= 10:
        global ans
        ans = max(ans, res)
        return

    for i in range(4):
        x = piece[i]

        if len(board[x]) == 2:
            x = board[x][1]
        else:
            x = board[x][0]

        for _ in range(1, order[depth]):
            x = board[x][0]

        if (x not in piece) or x == 32:
            before = piece[i]
            piece[i] = x
            dfs(piece, depth + 1, res + score[x])
            piece[i] = before

 

함수를 실행시키고, 정답을 출력합니다.

dfs([0, 0, 0, 0], 0, 0)
print(ans)

 

백준 17825 주사위 윷놀이 Python 코드였습니다.

감사합니다.

728x90