import sys
input = sys.stdin.readline
INF = 1e8
def BOJ2342() :
def get_distance(curr, target) :
if curr == target :
return 1
elif curr == 0 :
return 2
elif abs(curr - target) % 2 == 0 :
return 4
else :
return 3
l = list(map(int, input().split()))
# dp[n 번째 움직임][왼발위치][오른발위치]
dp = [[[INF for _ in range(5)] for _ in range(5)] for _ in range(len(l)+1)]
dp[0][0][0] = 0
for i in range(1, len(l)) :
move = l[i-1]
for left in range(5) :
for right in range(5) :
dp[i][move][right] = min(dp[i][move][right], dp[i-1][left][right] + get_distance(left, move))
dp[i][left][move] = min(dp[i][left][move], dp[i-1][left][right] + get_distance(right, move))
result = INF
for i in range(5) :
for j in range(5) :
result = min(result, dp[len(l)-1][i][j])
print(result)
BOJ2342()
접근 방법 :
1. dp는 dp[n번째 움직임][왼발 위치][오른발 위치]
2. dp의 초기값은 매우 큰 값으로 세팅해 주었다. 문제에서 왼발을 움직이는 경우와 오른발을 움직이는 두 개의 경우가 있을 수 있으므로 이전의 어느 위치에서 오든지 두개의 경우를 모두 고려해 주어야 한다.
* 만약 이동이 불가능 한 점에서 왼발 혹은 오른발을 옮겼을 경우 초기값이 무한대 값으로 설정되어 있으므로 움직였다 해도 무한대의 값으로 설정이 되어있을 것이다.
3. 마지막 index의 배열에서 최솟값을 구해주면 정답을 알 수 있다.
장애물 이였던 것 :
1. 결국 풀지 못했고 다른 분들의 풀이를 참고하였다.
https://www.acmicpc.net/problem/2342
2342번: Dance Dance Revolution
입력은 지시 사항으로 이루어진다. 각각의 지시 사항은 하나의 수열로 이루어진다. 각각의 수열은 1, 2, 3, 4의 숫자들로 이루어지고, 이 숫자들은 각각의 방향을 나타낸다. 그리고 0은 수열의 마
www.acmicpc.net
'알고리즘' 카테고리의 다른 글
편의점 2 [백준 14400] - python (0) | 2022.02.16 |
---|---|
행렬 곱셈 순서 [백준 11049] -python (0) | 2022.02.15 |
피사노 주기 [백준 9471] - python (0) | 2022.02.13 |
피보나치 수 3 [백준 2749] - python (0) | 2022.02.12 |
앱 [백준 7579] - python (0) | 2022.02.11 |