본문 바로가기
코딩테스트 파이썬/백준

Dance Dance Revolution ( 2342 번 )

by 세용용용용 2025. 9. 12.

2342번: Dance Dance Revolution

 


🧠 알고리즘

  • 동적 계획법(Dynamic Programming, DP) + 상태 압축 (양발 위치 상태를 기록하는 3차원 DP)

 

✔️ 동작 방식

  • 발판 이동 비용을 계산하는 함수 _cr(start, end)를 정의한다.
  • DP 배열 dp[i][l][r]를 사용한다.
  • 초기 상태는 양발이 중앙(0,0)에 있고 비용 0으로 시작.
  • 입력된 스텝 순서를 하나씩 진행
  • 마지막 스텝까지 처리한 뒤, 가능한 모든 상태 중 최소 비용을 정답으로 출력한다.

 

🧾 코드

import sys

def _cr(start, end):
    if start == 0:
        return 2
    elif start == end:
        return 1
    elif abs(start - end) == 2:
        return 4
    else:
        return 3

def _main(n_list):
    answer = float('inf')
    n_len = len(n_list)
    dp = [[[float('inf')] * 5 for _ in range(5)] for _ in range(n_len)]
    dp[0][0][0] = 0

    for i in range(n_len - 1):
        gogo = n_list[i]
        for l in range(5):
            for r in range(5):
                if dp[i][l][r] == float('inf'):
                    continue

                dp[i + 1][l][gogo] = min(dp[i + 1][l][gogo], dp[i][l][r] + _cr(r, gogo))
                dp[i + 1][gogo][r] = min(dp[i + 1][gogo][r], dp[i][l][r] + _cr(l, gogo))

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

    return answer

        
n_list = list(map(int, sys.stdin.readline().rstrip().split()))
print(_main(n_list))

 

⏱️ 시간 복잡도

dp 크기 : 5 * 5 * n

for i in range(n_len - 1) : 스텝 만큼 순회 ( 선형 시간 복잡도 )
	for l in range(5):
		for r in range(5):
        
해당 알고리즘 시간 복잡도 : 선형 시간 복잡도 ( O(n) )

'코딩테스트 파이썬 > 백준' 카테고리의 다른 글

농장 관리 ( 1245 번 )  (0) 2025.09.13
머리 톡톡 ( 1241 번 )  (0) 2025.09.13
합이 0인 네 정수 ( 7453 번 )  (0) 2025.09.11
보석 도둑 ( 1202 번 )  (0) 2025.09.08
노드사이의 거리 ( 1240 번 )  (0) 2025.09.08