본문 바로가기
Problem Solving/Dynamic Programming

[다이나믹 프로그래밍 / 파이썬] 백준 2342번 : Dance Dance Revolution / 골드 3

by ggyongi 2022. 4. 4.
반응형

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

 

2342번: Dance Dance Revolution

입력은 지시 사항으로 이루어진다. 각각의 지시 사항은 하나의 수열로 이루어진다. 각각의 수열은 1, 2, 3, 4의 숫자들로 이루어지고, 이 숫자들은 각각의 방향을 나타낸다. 그리고 0은 수열의 마

www.acmicpc.net

command = list(map(int, input().split()))

def score(a, b):
    if a == 0:
        return 2
    if a == b:
        return 1
    if abs(a-b) % 2 == 1:
        return 3
    if abs(a-b) % 2 == 0:
        return 4

inf = 9876543210

# dp[i][left][right]
dp = [[[inf for _ in range(5)] for _ in range(5)] for _ in range(len(command))]
dp[0][0][0] = 0

for i in range(1, len(command)):
    cur = command[i-1]  # 지금 밟아야 하는 위치

    # j : 움직이지 않은 발의 위치
    # k : 움직인 발의 이전 위치
    for j in range(5):
        left = inf
        right = inf
        for k in range(5):
            left = min(left, dp[i-1][k][j] + score(k, cur))  # 왼발을 움직였을 때
            right = min(right, dp[i-1][j][k] + score(k, cur))  # 오른발을 움직였을 때
        dp[i][cur][j] = left
        dp[i][j][cur] = right

answer = inf
for i in range(5):
    for j in range(5):
        answer = min(answer, dp[-1][i][j])
print(answer)

약 8개월 전에 시도했다가 못풀었는데, 이번에 드디어 해결하게 되었다.

고민은 굉장히 많이 했는데 답은 오히려 간단히 나왔다.

 

처음에는 여러가지 경우의 수를 따져 조건을 분기하려했으나 어차피 dp 값을 무한대로 초기화해놓으면

굳이 따져주지 않아도 최솟값을 찾는 과정에서 자연스럽게 걸러진다.

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글